Neo4j - рекурсивное сопоставление с образцом и возврат рекурсивного пути для определенных конечных узлов - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть структура, где узел либо "Leads_to" другой узел, либо "Colored_in" некоторого цвета. Отношение "Colored_in" и цвет являются просто упрощенной дополнительной информацией.

Теперь я хочу для каждого конечного узла относительно "Leads_to" всю информацию о родительских узлах, а также их дополнительную информацию по отношению "Colored_in",Чтобы упростить это, я приведу небольшой пример того, что я хочу:

CREATE (A:Key {name:'a'}),
(B:Key {name:'b'}),
(C:Key {name:'c'}),
(D:Key {name:'d'}),
(Black:Color {color:'black'}),
(Blue:Color {color:'blue'}),
(A)-[:Leads_to]->(B),
(A)-[:Leads_to]->(C),
(B)-[:Leads_to]->(D),
(A)-[:Colored_in]->(Black),
(B)-[:Colored_in]->(Blue),
(C)-[:Colored_in]->(Blue),
(D)-[:Colored_in]->(Black)

Этот код создаст следующую структуру:

                A-->Black
               / \
              /   \
      Blue<--B     C-->Blue
            /       
           /         
  Black<--D 

Это только приблизительно нарисовано и оба "синие"s и «Black» относятся к одному и тому же экземпляру «Blue» или «Black».

И в результате я хочу что-то вроде:

[{{name:'a',{color:'black'}; name:'b', {color:'blue'}; name:'d',{color:'black'}},
{{name:'a',{color:'black'}; name:'c', {color:'blue'}}]

Кроме того, цвет не может"Leads_to" что-то, ни быть "Colored_in" чем-то. Это всего лишь пример, реальный путь может быть намного длиннее. Кроме того, вложенный результат не обязательно должен быть в указанном выше формате, родители просто должны быть четко отделены друг от друга (например, ";") и должны быть в правильном порядке.

Редактировать:

Может быть, это помогает, что требуется не вся потенциальная информация из других отношений, а только из одного отношения, в данном случае "Colored_in", имя фиксировано, а свойства известны.

1 Ответ

0 голосов
/ 05 ноября 2019

Так, может быть, что-то вроде этого?

MATCH path = (leaf:Key)-[:Leads_to*]->(end)
WHERE NOT ()-[:Leads_to]->(leaf) AND NOT (end)-[:Leads_to]->()
RETURN [node in nodes(path) | node {.name, color: [(node)-[:Colored_in]->(colorNode) | colorNode.color][0]}] as result

При этом используется понимание списка, проекция карты и понимание шаблона, поэтому для каждого узла в каждом совпавшем пути выводится пользовательская карта имени узла иЦвет узла: Цвет узла.

Результаты:

╒══════════════════════════════════════════════════════════════════════╕
│"result"                                                              │
╞══════════════════════════════════════════════════════════════════════╡
│[{"name":"a","color":"black"},{"name":"b","color":"blue"},{"name":"d",│
│"color":"black"}]                                                     │
├──────────────────────────────────────────────────────────────────────┤
│[{"name":"a","color":"black"},{"name":"c","color":"blue"}]            │
└──────────────────────────────────────────────────────────────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...