Вопрос: как я считаю появление двух независимых моделей в одном Cypher запроса без использования дополнительных связей?Neo4j Cypher - подсчет вхождений двух независимых моделей в 1 запросе
Пример: для каждого человека в социальной сети подсчитывают, сколько у них друзей и сколько сообщений они сделали.
С дополнительными отношениями легко ...
друзья:
MATCH (person:PERSON)
WITH person
MATCH (person)-[?:KNOWS]-(friend:PERSON)
RETURN person.firstName AS name, count(friend) AS friends
+----------------------+
| name | friends |
+----------------------+
| "alex" | 3 |
| "aiya" | 1 |
| "jacob" | 1 |
| "peter" | 1 |
| "stranger" | 0 |
+----------------------+
Кол-во лиц Кол-во человек Сообщений:
MATCH (person:PERSON)
WITH person
MATCH (person)<-[?:HAS_CREATOR]-(post:POST)
RETURN person.firstName AS name, count(post) AS posts
+--------------------+
| name | posts |
+--------------------+
| "alex" | 0 |
| "aiya" | 3 |
| "jacob" | 3 |
| "peter" | 1 |
| "stranger" | 2 |
+--------------------+
друзей COUNT лиц и сообщений:
MATCH (person:PERSON)
WITH person
MATCH (person)-[?:KNOWS]-(friend:PERSON)
WITH person, count(friend) AS friends
MATCH (person)<-[?:HAS_CREATOR]-(post:POST)
RETURN person.firstName AS name, friends, count(post) AS posts
+------------------------------+
| name | friends | posts |
+------------------------------+
| "peter" | 1 | 1 |
| "aiya" | 1 | 3 |
| "alex" | 3 | 0 |
| "stranger" | 0 | 2 |
| "jacob" | 1 | 3 |
+------------------------------+
Однако, без дополнительных отношений результат запроса исключает все узлы, которые имели нулевой отсчет результат в любом из двух MATCH
положений:
MATCH (person:PERSON)-[:KNOWS]-(friend:PERSON)
WITH person, count(friend) AS friends
MATCH (person)<-[:HAS_CREATOR]-(post:POST)
RETURN person.firstName AS name, friends, count(post) AS posts
+---------------------------+
| name | friends | posts |
+---------------------------+
| "peter" | 1 | 1 |
| "aiya" | 1 | 3 |
| "jacob" | 1 | 3 |
+---------------------------+
FYI, желаемый результат:
+---------------------------+
| name | friends | posts |
+---------------------------+
| "alex" | 3 | 0 |
| "peter" | 1 | 1 |
| "aiya" | 1 | 3 |
| "jacob" | 1 | 3 |
+---------------------------+
Привет @Edward, это было скорее упражнение в любопытстве, чем что-либо еще. Пример, который я дал, является самым тривиальным, о котором я мог думать, но существуют более сложные случаи, когда независимые шаблоны более длинные, а дополнительные отношения сложнее применять. –