2009-10-23 7 views
10

Ich versuche, eine SPARQL-Abfrage zu schreiben, die mir alle foaf:Agents geben sollte, die nicht foaf:Persons sind.SPARQL Negation: Alle Foaf: Agenten, die nicht Foaf sind: Personen

Ich kann keine Möglichkeit sehen, this OPTIONAL/BOUND construct auf dieses Problem anzuwenden, da alle Eigenschaften wie rdfs:subClassOf und rdf:type transitiv und reflexiv sind.

Ich versuchte dies:

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

Aber rdf: type transitiv, zumindest mit JENA/ARQ/SDB zu sein scheint.

Antwort

10

Der Grund, warum dies nicht funktioniert, ist, weil Sie zwei separate Variablenbindungen haben (und ?y), die in Ihrer Abfrage nicht verwandt sind. So muss ?x gebunden sein, um in der Ergebnismenge zu erscheinen (was Sie wollen), aber wenn ?y ungebunden ist, haben Sie nichts Neues über gelernt.

Update: In einer idealen Abfrage würde ?y überhaupt nicht benötigt werden; Sie können die eingehenden/ausgehenden Edegs von direkt testen. Dies ist in SPARQL 1.0 schwierig (unmöglich?), Wenn Sie überprüfen möchten, ob eine Kante in einer gegebenen Variablenbindung nicht vorhanden ist. Allerdings wird SPARQL 1.1 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 . 
    NOT EXISTS { ?agent rdf:type foaf:Person . } 
} 

@Kingsley Idehen Ansatz (Dritt SPARQL-Erweiterungen verwenden), sollten Sie das Problem auf kurze Sicht zu lösen.

+0

Aber wie stelle ich eine Beziehung zwischen oben x und y? ? –

+0

SPARQL 1.1 wird definitiv eine Negation haben, das Panel der Arbeitsgruppe auf der ISWC 2009 war klar auf diesem – RobV

+0

Beachten Sie, dass SPARQL 1.1 Syntax (wie in der Link angegeben) ist tatsächlich FILTER NICHT EXISTS jetzt (benötigt das 'FILTER' Schlüsselwort oben Front) –

1

Via Virtuoso SPARQL Extensions Endpunkt für die Überprüfung http://lod.openlinksw.com/sparql (LOD Wolke Cache Instanz)

verschiedene SELECT x o

WHERE {

eine foaf x:?-Agent. ? X? P? O. Filter (bif: vorhanden ist ((wählen (1), wobei {xa foaf: Person})))

}

Grenze 10

DESCRIBE x

WHERE {

?

? Xa Foaf: Agent.

Filter (bif: exists ((Select (1), wobei {xa foaf: Person}))) }

Grenze 200

8

dieser 1.0 in SPARQL zu tun, dann würden Sie haben zu tun:

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

Als Phil M. sagt, wird 1.1 SPARQL neue Syntax einführen dies viel einfacher zu machen, zu schreiben.

Lee

+0

Ihre Lösung rettete meinen Tag !!! Vielen Dank! –