Pregunta Cómo ejecutar sentencias IN y NOT IN SPARQL en python rdflib para eliminar la intersección de dos gráficos


Estoy tratando de usar el IN y NOT IN declaraciones (que eran si entiendo correctamente, introducido en SPARQL 1.1) en la implementación python de SPARQL (ahora en rdfextras) pero parece que la sintaxis no es reconocida.

Consideremos dos conjuntos (A y B). Quiero mostrar lo que está en el Conjunto A, eliminando lo que está en el Conjunto B.

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

Tal vez esta cosa en particular se agregó en SPARQL 1.1 y no es compatible con rdfextra, en cuyo caso me encantaría tener una solución alternativa (o cómo hacerlo sin usar el NOT IN palabra clave)


5
2018-04-25 15:28


origen


Respuestas:


He intentado una consulta similar y también tengo una excepción de análisis. He pasado por Analizador SPARQL de rdflib código 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és usando correctamente. Echando un vistazo a la NOT IN definición en el SPARQL 1.1 spec ... define el IN Operador para ser usado contra una lista de expresiones. Por lo tanto, harías:

FILTER (?item NOT IN (?SetB))

Y no estoy completamente seguro de si puede usar variables en el lado derecho porque todos los ejemplos en las especificaciones usan términos.  editar: ver mensaje RobV, es posible utilizar variables en el RLH

solución con una consulta

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

SELECT ?title WHERE {
   some logic defining ?item
   OPTIONAL {
   some logic defining ?SetB
   }
   FILTER (bound(?SetB) && ?setB != ?item)
}

Sin saber más sobre su consulta, no puedo asesorar mejor con este caso.

solución con dos consultas

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

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

5
2018-04-25 19:53



Difícil de responder sin detalles, pero parece que quieres 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 yo sé, opera en una expresión de lista, no en una lista que puede definir.


2
2018-04-25 19:53