Запрос шифрования для подсчета количества отношений определенного типа, которые имеет каждый узел, включая отношения того же типа в их подузлах.

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

введите здесь описание изображения

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

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

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

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

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

person RollerMobster    schedule 30.04.2020    source источник


Ответы (1)


Для будущих посетителей это решение из ответа, который я получил от онлайн-сообщества 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-включая-тожесамое-типотношений-в-их-подузлах-задать-вопрос/17987

person RollerMobster    schedule 03.05.2020