2013-07-31 2 views
0

У меня есть таксономия как график Neo4j. Основная структура такова:Cypher: Обратный путь, где начало и конец могут быть равны

taxonomyName -HAS_ROOT_TERM-> root -IS_BROADER_THAN-> term -IS_BROADER_THAN-> term'-IS_BROADER_THAN-> term'' - ... 

Теперь я хочу, чтобы данный термин - например. Термин «» - его путь от корня таксономии (или нескольких путей, обратите внимание, что может быть несколько таксономий с несколькими правомочных корнями, структура на самом деле является поли-иерархия):

START n=node:index("id:term''Id") 
MATCH p = taxonomy-[:HAS_ROOT_TERM]->r-[:IS_BROADER_THAN*]->n 
RETURN TAIL(EXTRACT(n in NODES(p) : n.id)) 

TAIL исключает первое узел к тому, что я не возвращаю узел таксономии. Это работает отлично, за исключением случаев, когда я напрямую запрашиваю корень. Тогда ничего не возвращается. Конечно: я ищу путь, по крайней мере, с тремя элементами, узлом таксономии, корневым узлом и любым потомком корня. Теперь мне нужно будет выразить, что r и n могут быть равны. Я попытался сделать связь IS_BROADER_THAN необязательной, но затем возвращается только null, потому что шаблон не найден.

Как я могу ограничить свой запрос путями, включая корневой термин, и разрешить пути длины один, содержащий только корневой термин?

Спасибо!

ответ

1

Типичный случай "RTFM", я боюсь ;-)

документация на http://docs.neo4j.org/chunked/stable/query-match.html#match-zero-length-paths говорит нам, что

... root -[:IS_BROADER_THAN*0..]-> term ... 

делает трюк. Только указание звездочки предполагает диапазон 1... С 0.. начальный и конечный узлы могут быть одинаковыми, т. Е. Отношения, возможно, не были пройдены вообще.

Смежные вопросы