2011-04-25 10 views
5

Estoy tratando de usar las declaraciones IN y NOT IN (que eran si entiendo correctamente, introducido en SPARQL 1.1) en la implementación de python de SPARQL (ahora en rdfextras) pero parece que la sintaxis no se reconoce.Cómo ejecutar las sentencias IN y NOT IN SPARQL en python rdflib para eliminar la intersección de dos gráficos

Consideremos dos conjuntos (A y B). Quiero salida de lo que está en la serie A, la eliminación de lo que está en la Posición B.

SELECT ?title WHERE { 
    some logic defining ?item and ?SetB 
    FILTER (?item NOT IN ?SetB) 
} 

Quizás se añadió esta cosa en particular en SPARQL 1.1 y no es compatible con rdfextra, en cuyo caso me gustaría tener una solución (o cómo hacerlo sin utilizar la palabra clave NOT IN)

Respuesta

4

He intentado una consulta similar y también obtuve una excepción de análisis. He pasado por el código rdflib's SPARQL parser y no parece existir una regla para manejar IN o NOT IN. Supongo que esta funcionalidad no está implementada.

De todos modos, no estoy seguro de que lo esté utilizando correctamente. Echando un vistazo a la definición NOT IN en el SPARQL 1.1 spec ... define el operador IN que se utilizará en una lista de expresiones. Por lo tanto, haría:

FILTER (?item NOT IN (?SetB))

y no estoy completamente seguro si se puede utilizar variables en el lado derecho debido a que todos los ejemplos en los términos de uso de especificaciones. edición: ver el mensaje RobV, es posible utilizar variables en el HLR

solución con una consulta

Una posible solución, que podría funcionar para usted es utilizar OPTIONAL y bound (ambos apoyaron en rdflib). Algo como ...

Sin tener que saber más acerca de su consulta, no puedo aconsejar mejor con este caso.

solución con dos consultas

La forma más fácil de resolver esto con rdlib es utilizar filtros y dos consultas, la primera consulta recupera todos los posibles valores de ?SetB. Hormiga en la segunda consulta que dinámicamente crea un filtro:

SELECT ?title WHERE { 
    some logic defining ?item 
    FILTER (?item != <setb_val1> && ?item != <setb_val2> && 
    ... && ?item != <setb_val2>) 
} 
+0

Genial, eso es lo que estaba buscando. –

+0

Debería ser legal usar variables en el RHS de una expresión IN/NOT IN, el RHS se define como un 'ExpressionList' en la gramática 1.1 que permite cualquier lista de producciones' Expression', es decir, cualquier expresión válida y así debería incluir variables – RobV

+0

bueno saber, gracias Rob. Los ejemplos en la especificación son un poco engañosos. –

2

difícil de responder, sin detalles, pero parece que usted quiere MINUS:

SELECT ?title WHERE { 
    ?item ... ITEM CRITERIA ... 
    MINUS { ?item ... SET CRITERIA ... } 
} 

por ejemplo:

SELECT ?title WHERE { 
    ?item ex:colour "red" .  # item is red 
    MINUS { ?item ex:size "big" } # but not in set of big things 
} 

NOT IN es un poco engañoso: por lo que puedo decir, opera en una expresión de lista, no en una lista que puede definir.

+0

No creo que 'MINUS' se implemente en RDFLIB, pero es un buen truco. –

+0

sí, 'MINUS' es una característica 1.1 y por lo tanto no se implementa en rdflib. (Pero esa es la solución obious que yo también vine) –