Négociation SPARQL: Tous les éléments: Agents qui ne le sont pas: Personnes
Question
J'essaie d'écrire une requête SPARQL qui devrait me donner tous les foaf: agents
qui ne sont pas foaf: Personnes
.
Je ne vois pas comment appliquer cette OPTIONAL / BOUND construire à ce problème, car toutes les propriétés telles que rdfs: subClassOf
et rdf: type
sont transitives et réflexives.
J'ai essayé ceci:
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person }
FILTER ( !BOUND(?y) ) }
Mais rdf: type semble être transitif, du moins avec JENA / ARQ / SDB.
La solution
Cela ne fonctionne pas parce que vous avez deux liaisons de variable distinctes (? x
et ? y
) qui ne sont pas liées dans votre requête. Donc, ? X
doit obligatoirement figurer dans le jeu de résultats (ce que vous voulez), mais si ? Y
est non lié, vous n'avez rien appris de nouveau sur ? x
.
Mise à jour: dans une requête idéale, ? y
ne serait pas nécessaire; vous pouvez tester les edeg entrants / sortants de ? x
directement. Cela est difficile (impossible?) À faire dans SPARQL 1.0 lorsque vous voulez vérifier si une arête n'existe pas dans une liaison de variable donnée. Toutefois, SPARQL 1.1 prend en charge la négation:
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 .
FILTER NOT EXISTS { ?agent rdf:type foaf:Person . }
}
L'approche de @Kingsley Idehen (en utilisant des extensions SPARQL tierces) devrait vous aider à résoudre le problème à court terme.
Autres conseils
Pour ce faire dans SPARQL 1.0, vous devez écrire:
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . }
FILTER ( !BOUND(?y) )
}
Comme le dit Phil M , SPARQL 1.1 introduira une nouvelle syntaxe pour simplifier son écriture.
Voici la spécification (brouillon) SPARQL 1.1 pour la négation: http: // www. w3.org/TR/sparql11-query/#negation
Via les extensions Virtuoso SPARQL point de terminaison pour vérification http://lod.openlinksw.com/sparql (instance de cache LOD Cloud)
SELECT distinct ?x ?o
WHERE {
?x a foaf:Agent .
?x ?p ?o.
filter (!bif:exists ((select (1) where { ?x a foaf:Person } )))
}
limit 10
DESCRIBE ?x
WHERE {
?x a foaf:Agent .
filter (!bif:exists ((select (1) where { ?x a foaf:Person } )))
}
limit 200
Ce qui suit fonctionne maintenant, grâce à SPARQL 1.1:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT COUNT(?agent)
WHERE
{
?agent rdf:type foaf:Agent .
FILTER (NOT EXISTS { ?agent rdf:type foaf:Person . })
}
Exemples de liens en direct: