Запрос рекурсивных цепочек отношений в 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) может повторяться снова и снова, прежде чем наконец достичь интересующей меня группы. в.

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

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

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

Итак, я хочу что-то вроде [?:INLINE]-> 0..n цепочек (fieldref-field-datatype-group).

есть идеи?


person Kevin Hoffman    schedule 23.05.2013    source источник


Ответы (1)


Согласно справочнику 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.

person Manuel Hernandez    schedule 23.05.2013
comment
Да, я знал про звездочку. На самом деле я пытался быть слишком сложным и описать точную форму, когда я мог просто сказать Нео, что мне нужен любой путь любой длины от сообщения к группе, например: msg-[?:INLINE|FIELDREF| ПОЛЕ|ТИП ДАННЫХ*]-›n - person Kevin Hoffman; 24.05.2013