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

War es hilfreich?

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:

  1. Abfrage Lösung

  2. Query-Definition

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top