2013-11-28 6 views
0

Мой график - это направленное дерево, каждая ветвь по дереву имеет уникальную метку для каждого из узлов. Например, все узлы в ветке 1 имеют метку: branch 1, а все узлы в ветке 2 имеют метку: «ветвь 2». Корневой узел (узел 0) имеет обе метки: branch 1: branch 2Neo4j cypher запрос для перечисления всех узлов в последовательности в однонаправленном пути, соответствующем определенной метке

Что такого шифровальщик запрос перечислить все идентификаторы узлов в branch 1, начиная с корневым узлом в последовательности до последнего узла (с использованием метки:» ветвь 1 ', чтобы найти соответствующие узлы). I.e., для каждого перечисленного узла он и узел непосредственно перед этим также должны иметь метку «ветвь 1».

+0

Какие у вас отношения между узлами ветки? Если у вас есть уникальный ярлык для каждой ветви, вы можете получить все узлы ветви с этим, но если у вас нет отношений, ветвь не находится в какой-либо последовательности, и это не путь (или ветка, если на то пошло, это куча листья в мешке с надписью «ветка х»). – jjaderberg

ответ

0

Если я правильно понял, вы на самом деле не используете метки Neo4j 2.0 :Label на своих узлах, но свойство называется label на ваших отношениях? Если это так общий запрос может быть что-то вроде

START root=node(0) 
MATCH path=root<-[rels:IS_BEFORE*1..100]-leaf 
WHERE ALL(rel in rels WHERE rel.label = "branch 1") 
RETURN EXTRACT(n in nodes(path) | ID(n)) as nodeIdSequence 

Это, вероятно, не очень эффективно, так как он соответствует всем ветвям и только ограничивает результат соответствующей отрасли впоследствии. Было бы более эффективно идентифицировать ветвь по типу отношений, что-то вроде (root)-[:NEXT_ON_BRANCH_1]->(branchNode). В качестве альтернативы вы можете выполнить совпадение в два этапа: 1) сопоставить первый узел в каждой ветви и найти правильную ветвь. 2) Теперь, когда вы знаете, что у вас есть правильная ветка, сравните ее. Вы можете попробовать что-то вроде

START root=node(0) 
MATCH root<-[r:IS_BEFORE]-branch 
WHERE r.label = "branch 1" 
WITH branch 
MATCH path=branch<-[:IS_BEFORE*1..100]-leaf 
RETURN EXTRACT(n in nodes(path) | ID(n)) as nodeIdSequence 

Если это не то, что ваша модель выглядит, пожалуйста, поделитесь выборочные данные по http://console.neo4j.org

(предел глубины *1..100 выше произвольно, установите его на все, что вы хотите, но обычно установка некоторый предел - хорошая идея.)

+0

Благодарим за отзыв. На самом деле, узлы имеют метки, а не отношения. Таким образом, «ветвь 1» является меткой на узлах в ветке 1 и т. Д. – user3045118

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