2011-10-29 14 views
18

Tengo algunos triples que se ven así:SPARQL seleccionar opcional con el lenguaje

test:thing rdfs:label "Non-Language Label" 
test:thing rdfs:label "English Label"@en 
test:thing rdfs:label "French Label"@fr 

me gustaría formar una consulta SPARQL que me la "Etiqueta de no expertos en lenguas" y el "Etiqueta francesa" da, si existe alguno

He intentado esto y no funciona:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label ?preferredLabel 
WHERE { 
    test:thing rdfs:label ?label 
    OPTIONAL { 
    test:thing rdfs:label ?preferredLabel . 
    FILTER (regex(str(?preferredLabel), '(^|\\\\W)fr', 'i')) 
    } 
} 

Gracias de antemano!

Respuesta

21

no veo por qué necesita OPTIONAL aquí en absoluto. La consulta de Jan está fallando porque no hay una variable compartida entre el patrón externo y el opcional, por lo que está intentando calcular el producto cruzado de cada etiqueta para test:thing con cada test:thing que no sea francés y que indique que el procesador de consultas está fallando.

simplemente desea algo como lo siguiente a menos que yo he entendido bien su pregunta

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label 
WHERE 
{ 
    test:thing rdfs:label ?label 
    FILTER(LANG(?label) = "" || LANGMATCHES(LANG(?label), "fr")) 
} 

Si desea que las dos etiquetas por separado entonces se podría hacer algo como:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label ?preferredLabel 
WHERE 
{ 
    { 
    test:thing rdfs:label ?label . FILTER(LANG(?label) = "") 
    } 
    UNION 
    { 
    test:thing rdfs:label ?preferredLabel . FILTER(LANGMATCHES(LANG(?label), "fr")) 
    } 
} 
+0

¡Me pusiste en el camino correcto! ¡¡¡Gracias!!! –

4

La manera más fácil de verificar el idioma de los literales es usar la función lang(). El uso de este, su consulta se puede escribir como:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX test: <http://test#> 
SELECT ?label ?preferredLabel 
WHERE { 
    test:thing rdfs:label ?label 
    OPTIONAL { 
    test:thing rdfs:label ?preferredLabel . 
    FILTER (lang(?preferredLabel) = "" || lang(?preferredLabel) = "fr") 
    } 
} 
+0

Hi - gracias por la ayuda. Tiene razón al agregar la lógica de filtrado en alguna parte, lo que parece ser bueno. Sin embargo, esta consulta simplemente me falla. Creo que el problema comienza cuando básicamente selecciono los mismos datos dos veces (como? Label y como? PreferredLabel). Me gustaría tener la etiqueta? Y la? Etiqueta preferida en el mismo registro. Me he quedado un poco perplejo con esta, aparentemente simple, ¡pero no tanto! Gracias por la ayuda –

2
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?uri ?label ?preferredLabel 
WHERE 
{ 
    { 
    ?uri rdfs:label ?label . FILTER(LANG(?label) = "" && regex(str(?label), '(^|\\\\W)fr', 'i')) 
    } 
    UNION 
    { 
    ?uri rdfs:label ?preferredLabel . FILTER(LANG(?preferredLabel) = "fr" && regex(str(?preferredLabel), '(^|\\\\W)fr', 'i')) 
    } 
}