virtuoso query online example ejemplos avg rdf sparql owl triplestore

rdf - query - sparql online



SPARQL seleccionar opcional con idioma (3)

Tengo algunos triples que se ven así:

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

Me gustaría realizar una consulta sparql que me dé la "Etiqueta de no idioma" y la "Etiqueta francesa", si existe alguna.

Intenté esto y no está funcionando:

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 por adelantado!


La forma más fácil de verificar el lenguaje de los literales es usar la función lang (). Usando esto, su consulta puede escribirse 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") } }


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 etiqueta francesa no test:thing que puede ser enorme y por qué la consulta el procesador está fallando

Simplemente desea algo como lo siguiente a menos que haya entendido mal 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 quieres las dos etiquetas por separado, entonces podrías 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")) } }


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'')) } }