rdf - query - seleccionando usando sparql basado en ''el triple no existe''
sparql online (2)
Necesito un poco de ayuda para seleccionar los triples correctos de mi tienda ...
<a> a <type/1> .
<b> a <type/1> .
<c> a <type/1> .
<c> a <type/2> .
Quiero seleccionar solo los elementos que son tipo / 1 y no tipo / 2
¿Cuál es la mejor manera de lograr esto usando una consulta de selección de sparql?
Estoy buscando algo como:
select ?a where
{
?a a <type/1> .
!{ ?a a <type/2> }
}
Gracias,
:)
En SPARQL 1.0 eso es un poco complicado:
SELECT ?a WHERE {
?a a <type/1>.
OPTIONAL {
?a a ?othertype .
FILTER (?othertype = <type/2>)
}
FILTER (!BOUND(?othertype))
}
La cláusula OPTIONAL
une a ?othertype
para cualquier ?a
que tenga <type/2>
, y la deja sin unir para cualquier ?a
que no lo tenga".
Luego, el FILTER
final selecciona solo aquellas filas donde ?a
se dejó sin unir.
En SPARQL 1.1 es mucho más fácil:
SELECT ?a WHERE {
?a a <type/1>.
FILTER NOT EXISTS { ?a a <type/2> . }
}
Una solución SPARQL 1.1 alternativa es utilizar MINUS
por ejemplo,
SELECT ?a
WHERE
{
?a a <type/1> .
MINUS { ?a a <type/2> . }
}
MINUS
resta las soluciones que coinciden con su triple patrón de las coincidencias existentes.
En la mayoría de los casos, usar FILTER NOT EXISTS { }
y MINUS { }
son equivalentes, pero tenga en cuenta que hay algunos casos en los que esto no es cierto. Consulte la especificación SPARQL 1.1 para ver algunos ejemplos de esto.