2009-10-23 20 views
10

Estoy tratando de escribir una consulta SPARQL que debería darme todos los foaf:Agents que no son foaf:Persons.Negación de SPARQL: Todos los foaf: Agentes que no son foaf: Personas

No puedo ver una forma de aplicar this OPTIONAL/BOUND construct a este problema, porque todas las propiedades como rdfs:subClassOf y rdf:type son transitivas y reflexivas.

yo probamos este:

SELECT * WHERE { 
?x rdf:type foaf:Agent 
OPTIONAL { ?y rdf:type foaf:Person } 
FILTER (!BOUND(?y)) } 

Pero RDF: tipo parece ser transitiva, al menos con JENA/ARQ/SDB.

Respuesta

10

La razón por la que esto no funciona es porque tiene dos enlaces de variable separados (?x y ?y) que no están relacionados en su consulta. Por lo tanto, ?x debe aparecer obligatoriamente en el conjunto de resultados (que es lo que desea), pero si ?y está desactivado, no ha aprendido nada nuevo sobre ?x.

Actualización: En una consulta ideal, no habría necesidad de ?y en absoluto; puede probar los edegs entrantes/salientes de ?x directamente. Esto es difícil (¿imposible?) Hacer en SPARQL 1.0 cuando desea verificar si un borde no existe en un enlace de variable determinado. Sin embargo, SPARQL 1.1 prestará apoyo para la negación:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 

SELECT ?agent 
WHERE 
{ 
    ?agent rdf:type foaf:Agent . 
    NOT EXISTS { ?agent rdf:type foaf:Person . } 
} 

enfoque de @Kingsley Idehen (el uso de terceros extensiones SPARQL) debe ayudar a resolver el problema en el corto plazo.

+0

Pero, ¿cómo puedo configurar una relación entre X e Y? ? –

+0

SPARQL 1.1 es sin duda va a tener la negación, el panel de grupo de trabajo en ISWC 2009 fueron claros en que – RobV

+0

Tenga en cuenta que SPARQL 1.1 sintaxis (como se especifica en el enlace) es en realidad 'filtro no EXISTS' ahora (necesita la palabra clave' filter hasta frente) –

1

Via Virtuoso Extensiones SPARQL punto final para la verificación http://lod.openlinksw.com/sparql (LOD Nube instancia caché)

SELECT DISTINCT x o

DONDE {

x un foaf:??? Agente. ? X? P? O. filtro (BIF: existe ((SELECT (1) donde {foaf xa: Persona})))

}

límite de 10

DESCRIBE x

DONDE {

?

? Xa foaf: Agente.

filtro (BIF: existe ((SELECT (1) donde {xa foaf: Persona})))}

límite de 200

8

Para hacer esto en SPARQL 1.0, que tendría hacer:

SELECT * WHERE { 
    ?x rdf:type foaf:Agent 
    OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . } 
    FILTER (!BOUND(?y)) 
} 

Como dice Phil M., SPARQL 1.1 introducirá nueva sintaxis para hacer esto mucho más fácil de escribir.

Lee

+0

su solución me salvó el día !!! ¡Gracias! –

Cuestiones relacionadas