2016-09-23 4 views
0

Я работаю над небольшим проектом, в котором мне нужно следить за такими пользователями, как твиттер. Я пытаюсь сделать запрос, который возвращает последователей определенного узла, назовем его узлом «X». Таким образом, запрос возвращает последователей «X» и количество последователей последователей «X» и количество, на которое следуют последователи «X», включая «X» в этом счетчике. Извините за игровой процесс. Давайте посмотрим пример с изображениями:Neo4J Cypher - подсчет отношений совпадающих узлов

У меня есть следующие узлы:

Nodes

И я хочу знать все последователь Node 2 и отсчеты я упоминал прежде, чем его последователь. Я создал следующий запрос:

MATCH (:User{id:2})<-[:Follows]-(followers) 
OPTIONAL MATCH (followers)-[r1:Follows]->(:User) 
OPTIONAL MATCH (:User)-[r2:Follows]->(followers) 
RETURN followers.id, count(r1) AS Follows, count(r2) AS Following; 

Но он не в двух значениях: Граф узлов Узел 1 следует, и количество узлов, которые следует Node 6: enter image description here

Здесь вы можете увидеть все отношения: enter image description here

Любая помощь будет оценена по достоинству. Благодарю.

ответ

2

Я думаю, что выполнение обоих ваших ДОПОЛНИТЕЛЬНЫХ МАТЕРИАЛОВ спиной к спине приводит к получению нескольких повторяющихся результатов (рассмотрите вывод на каждом этапе с задействованными переменными ... несколько совпадений строк для каждого последующего последователя с перекрестным продуктом для всех строка соответствует тому, кто следует за каждым последователем).

В то время как вы можете исправить это путем сборки данных (получение счета) после каждого ФАКУЛЬТАТИВНОГО MATCH, лучший подход заключается в переходе от использования опциональных спичек и вместо того, чтобы получить число отношений непосредственно с функцией SIZE:

MATCH (:User{id:2})<-[:Follows]-(followers) 
RETURN followers.id, SIZE((followers)-[:Follows]->()) AS Follows, SIZE(()-[:Follows]->(followers)) AS Following 
+0

О, боже мой, спасибо! Оно работало завораживающе! – Guolf3377

Смежные вопросы