SPARQL Negierung: Alle foaf: Mittel, die nicht foaf sind: Personen
Frage
Ich versuche, eine SPARQL-Abfrage zu schreiben, die mir alle foaf:Agents
geben soll, die nicht foaf:Persons
.
Ich kann nicht sehen, einen Weg diese OPTIONAL / BOUND anzuwenden konstruieren für dieses Problem, weil alle Eigenschaften wie rdfs:subClassOf
und rdf:type
sind transitiv und reflexiv.
Ich habe versucht, dies:
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person }
FILTER ( !BOUND(?y) ) }
Aber rdf:. Typ scheint transitiv zu sein, zumindest mit JENA / ARQ / SDB
Lösung
Der Grund, warum dies nicht funktioniert, weil Sie zwei separate Variablenbindungen haben (?x
und ?y
), die in der Abfrage nicht verwandt sind. So ?x
gebunden sein muss in der Ergebnismenge angezeigt werden (das ist, was Sie wollen), aber wenn ?y
ungebunden ist, haben Sie nichts Neues über ?x
gelernt.
Update: In einer idealen Abfrage, es gäbe überhaupt keine Notwendigkeit für ?y
sein; Sie können direkt auf den ein- / ausgehenden edegs von ?x
testen. Das ist schwer (unmöglich?) In SPARQL 1.0 zu tun, wenn Sie überprüfen möchten, ob eine Kante auf eine bestimmte Variable nicht vorhanden ist verbindlich. Allerdings SPARQL 1.1 wird die Unterstützung für die Negation bieten:
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 . }
}
@Kingsley Idehen Ansatz (Dritt SPARQL-Erweiterungen verwenden), sollten Sie das Problem auf kurze Sicht zu lösen.
Andere Tipps
Um dies zu tun in SPARQL 1.0, müßten Sie schreiben:
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . }
FILTER ( !BOUND(?y) )
}
Als Phil M sagt , 1.1 SPARQL neue Syntax einführen wird dies viel einfacher zu machen, zu schreiben.
Hier ist die (Entwurf) SPARQL 1.1-Spezifikation für Negation: http: // www. w3.org/TR/sparql11-query/#negation
Via Virtuoso SPARQL-Erweiterungen Endpunkt für die Überprüfung http://lod.openlinksw.com/sparql (LOD Wolke Cache Instanz)
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
Im Folgenden nun arbeitet, mit freundlicher Genehmigung von 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 . })
}
Live-Beispiel Links: