Сайфер: как найти все цепочки одиночных узлов, не повторяющихся?
Я хочу найти ВСЕ пути, начинающиеся и заканчивающиеся от / к конкретному узлу. Мне бы хотелось, чтобы каждый узел в пути появлялся только один раз.
Например, на графике вот так:
(a)-[:REL]->(b)-[:REL]->(c)-[:REL]->(a)
(a)-[:REL]->(e)-[:REL]->(f)-[:REL]->(a)
(e)-[:REL]->(b)
grafically:
e → b
↙ ↖ ↗ ↘
f → a ← c
Шифр код:
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)
Я хотел бы, чтобы исследование цепочек, начиная с (а), возвращало
(a)->(b)->(c)->(a)
(a)->(e)->(f)->(a)
(a)->(e)->(b)->(c)->(a)
в то время как начиная с (f) возвращает только
(f)->(a)->(e)->(f)
и не
(f)->(a)->(b)->(c)->(a)->(e)->(f)
потому что он проходит дважды через узел (а).
Я попробовал:
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
но у меня нет результата. Лучшее, чего я смог достичь - это не повторять только начальный узел с этим запросом:
MATCH p=(a {name:'F'})-[:REL*1..]->(a)
WHERE SINGLE(e IN TAIL(NODES(p)) WHERE e=a)
RETURN p
но, очевидно, это не то, что я хочу, потому что он также возвращает
(f)->(a)->(b)->(c)->(a)->(e)->(f)
это путь, включающий узел (а) дважды.
Может кто-нибудь предложить мне решение?
Заранее спасибо.
Постскриптум Используемая мной версия Neo4j - 2.0