Sparql - Aplicando critérios de limitação a predicados
Sou relativamente novo no RDF / Sparql, portanto peço desculpas por qualquer terminologia incorreta e também pelo exemplo bastante terrível a seguir:
Dado o seguinte conjunto de dados 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 .
Estou tentando identificar amigos de amigos quee:Marty
conhece através de outrose:Freemason
s apenas.
Assim:
Marty conhece Mike através de Eugene, e todos eles são do Freemason, então está tudo bemMarty conhece Eugene, que tem um amigo civil Paul. Paul tem um amigo maçom Alan. No entanto, Marty não tem um caminho "apenas de maçom" para Alan, então ele deve ser excluído.Aqui está a consulta SPARQL que tenho:
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 .
}
Isso retorna:
http://www.example.com/#Eugene
http://www.example.com/#Mike
http://www.example.com/#Alan
Aqui, Alan é incluído quando ele corresponde aois-a-freemason
critério.
Como modifico a consulta para excluir Alan?