2013-05-23 2 views
2

У меня есть база данных графов, которая моделирует метаданные для сообщений и поля, которые могут содержаться в этих сообщениях. Некоторые из этих полей могут быть «группами», которые являются группами других полей. Я пытаюсь спросить Нео, «какие сообщения используют эту группу?». Ниже приведен список типов путей, которые могут быть использованы, чтобы получить из сообщения в группу:Запрос рекурсивных цепочек отношений в Neo4j с Cypher

message-[:INLINE]->group (the fields of a group are used inline on a message) 
message-[:FIELDREF]->(fref)-[:FIELD]->(field)-[:DATATYPE]->group (the group is used as a data type by a field on the message) 

второй цепью является рекурсивной. Другими словами, сегмент - [: FIELDREF] -> (fref) - [: FIELD] -> (field) - [: DATATYPE] - (group) может повторяться снова и снова, прежде чем, наконец, дойдем до интересующей меня группы in.

Итак, что я хочу знать, как я могу попросить повторить цепочку отношений, а не просто несколько (например, * после имени отношения) для каждого отдельного элемента пути?

Чтобы вернуться в группу, вы можете либо перейти к группе из сообщения, пройдя связь [: INLINE], которая затем может следовать за n целыми целями «fieldref-field-datatype-group». ИЛИ вы можете добраться до группу из сообщения путем прохождения n числа цепей «fieldref-field-datatype-group».

START group=node({sourceGroupId}) 
... ? ? ? ... 

Так что я хочу что-то вроде: -> 0..n из (FieldRef-полевой тип данных-групп) цепей [INLINE?].

Любые мысли?

ответ

4

По ссылке Cypher в http://docs.neo4j.org/chunked/milestone/query-match.html ...

12.2.13. Отношения переменной длины Узлы, являющиеся переменным числом отношений → удаленные узлы, можно найти, используя следующий синтаксис: - [: TYPE * minHops..maxHops] ->. minHops и maxHops являются необязательными и по умолчанию равны 1 и бесконечности соответственно. Если не заданы ограничения, точки могут быть опущены.

Ниже приведен пример того, что я думаю, что вы ищете. Я устанавливаю минимум на два.

start n=node:node_auto_index(name='Neo') match n-[r:KNOWS*2..]-m return n as Neo,r,m 

Вы можете проверить этот запрос стенографический на http://console.neo4j.org

+0

Да, я знал о звездочке. Я на самом деле пытался быть слишком сложным и описывал точную форму, когда я мог просто сказать Neo, что я хочу «любой путь, какой бы то ни было длины, из сообщения в группу», например: msg - [?: INLINE | FieldRef | ПОЛЕ | DATATYPE *] -> п –

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