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