Sparql: aplicación de criterios limitantes a predicados
Soy bastante nuevo en RDF / Sparql, así que me disculpo por cualquier terminología incorrecta y también por el ejemplo bastante terrible que sigue:
Dado el siguiente conjunto de datos RDF:
@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 .
Estoy tratando de identificar amigos de amigos quee:Marty
sabe a través de otrae:Freemason
solo s.
Entonces:
Marty conoce a Mike a través de Eugene, y todos son masones, así que está bien.Marty conoce a Eugene, quien tiene un amigo civil, Paul. Paul tiene un amigo masón, Alan. Sin embargo, Marty no tiene un camino de "solo masones" hacia Alan, por lo que debería ser excluido.Aquí está la consulta SPARQL que tengo:
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 .
}
Esto devuelve:
http://www.example.com/#Eugene
http://www.example.com/#Mike
http://www.example.com/#Alan
Aquí, Alan está incluido mientras coincide con elis-a-freemason
criterios
¿Cómo modifico la consulta para excluir a Alan?