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

Respuestas a la pregunta(2)

Su respuesta a la pregunta