Cypher-запрос для подсчета количества отношений определенного типа c, которые есть у каждого узла, включая отношения одного типа в своих подузлах. - PullRequest
1 голос
/ 30 апреля 2020

У меня есть иерархия узлов, подобная следующей, где узлы c1..c6 имеют тип: Категория, а их подузлы i1..i7 имеют тип: Item.

enter image description here

Что мне нужно получить, так это количество предметов в каждой категории, включая их подкатегории. Вывод должен выглядеть следующим образом:

category    childCount  itemCount
   c1           5           7
   c2           2           4
   c3           1           3
   c4           0           2
   c5           0           1
   c6           0           2

В настоящее время у меня есть запрос, который возвращает правильное количество дочерних узлов, но количество элементов отображается только для каждого узла, а не суммируется в общем. Не уверен, что я что-то здесь упускаю, или это неправильный подход?

Важно отметить, что я не могу полагаться на указание начального узла самостоятельно, поскольку он может со временем меняться внутри БД, поэтому запрос должен начинаться с узла Category, у которого нет родителя.

MATCH p = (c:Category)-[:IS_PARENT_OF *0..]->(c)
WITH c, apoc.text.join("1" + [rel in relationships(p) | rel.index], '.') as path, size((:Category)<-[:IS_PARENT_OF*]-(c)) as childCount, size((:Item)-[:IS_CATEGORIZED_AS]->(c)) as itemCount, c.name AS name
ORDER BY path
RETURN name, childCount, itemCount

Вывести как есть:

category    childCount  itemCount
   c1           5           0
   c2           2           1
   c3           1           1
   c4           0           2
   c5           0           1
   c6           0           2

1 Ответ

0 голосов
/ 03 мая 2020

Для будущих посетителей это решение, которое я получил от интернет-сообщества neo4j:

MATCH (category:Category)
OPTIONAL MATCH (category)-[:IS_PARENT_OF*..10]->(c)
OPTIONAL MATCH (category)<-[:IS_CATEGORIZED_AS]-(item1:Item)
OPTIONAL MATCH (c)<-[:IS_CATEGORIZED_AS]-(item2:Item)
RETURN category.name AS category,
   count(DISTINCT(c)) AS childCount,
   count(DISTINCT(item1)) + count(DISTINCT(item2)) AS itemCount

Подробнее см. Здесь:

https://community.neo4j.com/t/cypher-query-to-count-the-number-of-relationships-of-specific-type-that-each-node-has-including-same-type-relationships-in-their-sub-nodes-ask-question/17987

...