Cypher: como encontrar todas as cadeias de nós únicos não repetidas?
Quero encontrar TODOS os caminhos que começam e terminam de / para um nó específico. Eu gostaria que cada nó em um caminho fosse exibido apenas uma vez.
Por exemplo, em um gráfico como este:
(a)-[:REL]->(b)-[:REL]->(c)-[:REL]->(a)
(a)-[:REL]->(e)-[:REL]->(f)-[:REL]->(a)
(e)-[:REL]->(b)
graficamente:
e → b
↙ ↖ ↗ ↘
f → a ← c
Código Cypher:
CREATE (a { name:'A' })-[:REL]->(b {name:'B'})-[:REL]->(c { name:'C' })
-[:REL]->(a)-[:REL]->(e {name:'E'})-[:REL]->(f {name:'F'})-[:REL]->(a),
(e)-[:REL]->(b)
Gostaria que a pesquisa de cadeias a partir de (a) retorne
(a)->(b)->(c)->(a)
(a)->(e)->(f)->(a)
(a)->(e)->(b)->(c)->(a)
enquanto que a partir de (f) retorna apenas
(f)->(a)->(e)->(f)
e não
(f)->(a)->(b)->(c)->(a)->(e)->(f)
porque passa duas vezes pelo nó (a).
Eu tentei:
MATCH p=(a {name:'F'})-[:REL*1..]->(a)
WHERE SINGLE(e1 IN TAIL(NODES(p)) WHERE SINGLE(e2 IN TAIL(NODES(p)) WHERE e1=e2))
RETURN p
mas não tenho resultado. O melhor que consegui alcançar é não repetir apenas o nó inicial com esta consulta:
MATCH p=(a {name:'F'})-[:REL*1..]->(a)
WHERE SINGLE(e IN TAIL(NODES(p)) WHERE e=a)
RETURN p
mas obviamente não é o que eu quero, porque retorna também
(f)->(a)->(b)->(c)->(a)->(e)->(f)
esse é um caminho que envolve o nó (a) duas vezes.
Alguém pode me sugerir uma solução?
Agradeço antecipadamente.
P.S. A versão do Neo4j que eu uso é 2.0