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:Freemasons 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?

questionAnswers(2)

yourAnswerToTheQuestion