Sparql - Begrenzungskriterien auf Prädikate anwenden

Ich bin ziemlich neu in RDF / Sparql, also entschuldige mich für eine falsche Terminologie und auch für das ziemlich schreckliche Beispiel, das folgt:

Gab den folgenden RDF-Datensatz:

@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix e:     <http://www.example.com/#> .
@prefix foaf:  <http://xmlns.com/foaf/0.1/> .

e:Freemason a owl:Class .
e:Civilian a owl:Class .

e:Marty a e:Freemason .
e:Eugene a e:Freemason .
e:Mike a e:Freemason .
e:Alan a e:Freemason .

e:Paul a e:Civilian .

e:Marty foaf:knows e:Eugene .
e:Eugene foaf:knows e:Mike .
e:Eugene foaf:knows e:Paul .
e:Paul foaf:knows e:Alan .

Ich versuche Freunde von Freunden zu identifizieren, diee:Marty kennt durch anderee:Freemasonur @s.

So

Marty kennt Mike durch Eugene und sie sind alle Freimaurer, also ist es in Ordnung Marty kennt Eugene, der einen zivilen Freund Paul hat. Paul hat einen Freimaurerfreund Alan. Marty hat jedoch keinen "Nur-Freimaurer" -Pfad zu Alan, daher sollte er ausgeschlossen werden.

Hier ist die SPARQL-Abfrage, die ich habe:

prefix e: <http://www.example.com/#>
prefix foaf:  <http://xmlns.com/foaf/0.1/>

SELECT *
{
  <http://www.example.com/#Marty> foaf:knows+ ?target .
  ?target a e:Freemason .
}

Dies gibt zurück:

 http://www.example.com/#Eugene
 http://www.example.com/#Mike
 http://www.example.com/#Alan

Hier ist Alan dabei, da er mit dem @ übereinstimis-a-freemason Kriterien.

Wie ändere ich die Abfrage, um Alan auszuschließen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage