В neo4j, запрос для подсчета количества различных структур - PullRequest
0 голосов
/ 06 октября 2019

В neo4j моя база данных состоит из цепочек узлов. Для каждой отдельной структуры / макета (у теории графов есть лучшее слово?), Я хочу посчитать количество цепочек. Например, база данных состоит из 9 узлов и 5 взаимосвязей, например:

(:a)->(:b)
(:b)->(:a)
(:a)->(:b)
(:a)->(:b)->(:b)

, где (: a) - это узел с меткой a. Свойства узлов и отношений не имеют значения.

Результат подсчета должен быть следующим:

------------------------
| Structure        | n |
------------------------
| (:a)->(:b)       | 2 |
| (:b)->(:a)       | 1 |
| (:a)->(:b)->(:b) | 1 |
------------------------

Есть ли запрос, который может достичь этого?

Приложение

Запрос на создание тестовых данных:

create (:a)-[:r]->(:b), (:b)-[:r]->(:a), (:a)-[:r]->(:b), (:a)-[:r]->(:b)-[:r]->(:b)

1 Ответ

1 голос
/ 06 октября 2019

РЕДАКТИРОВАТЬ:

Спасибо за разъяснения.

Мы можем получить эквивалент того, что вы хотите, захват шаблона пути с использованием имеющихся меток:

MATCH path = (start)-[*]->(end)
WHERE NOT ()-->(start) and NOT (end)-->()
RETURN [node in nodes(path) | labels(node)[0]] as structure, count(path) as n

Это даст вам список меток узлов (первый ярлык присутствует для каждого ... помните, что узлы могут быть многокомпонентными, что может отбрасывать ваши результаты).

Что касается получения именно этого формата в вашем примере, это совсем другое. Мы могли бы сделать это с некоторыми текстовыми функциями в процедурах APOC , в частности apoc.text.join().

. Нам нужно было бы сначала добавить форматирование вокруг извлечения первой метки, чтобы добавить префикс :а также скобки. Тогда мы могли бы использовать apoc.text.join(), чтобы получить строку, в которой узлы соединены желаемым символом '->':

MATCH path = (start)-[*]->(end)
WHERE NOT ()-->(start) and NOT (end)-->()
WITH [node in nodes(path) | labels(node)[0]] as structure, count(path) as n
RETURN apoc.text.join([label in structure | '(:' + label + ')'], '->') as structure, n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...