Neo4j Cypher Queries - PullRequest
       5

Neo4j Cypher Queries

0 голосов
/ 26 февраля 2020

Я новичок в neo4j, и у меня есть следующие отношения, подобные этой

A is a friend of B
A is a friend of E
B is a friend of C
C is a friend of D
C is a friend of F
E is a friend of G
G is a friend of H

Я хочу получить результат друзей друзей A, где A на данный момент не является другом, заказав количество друзей по DES C. Ожидаемый результат:

C ---> 2
D ---> 1
F ---> 1
G ---> 1
H ---> 1

A, B, C, D, E, F, G, H являются узлами, и они связаны отношениями [: friends]. Буду очень признателен, если кто-нибудь сможет дать решение для этого.

Ответы [ 3 ]

1 голос
/ 26 февраля 2020
MATCH (a)-[:friends]-(f)-[:friends]-(fof) WHERE a.name = 'A' AND NOT (a)-[:friends]-(fof)
WITH DISTINCT fof
MATCH ( fof)-[:friends]-(l) 
RETURN fof.name , COUNT (DISTINCT l)
0 голосов
/ 27 февраля 2020

Этот запрос возвращает ожидаемые значения:

// Get a collection of all friends of 'A'
MATCH (a)-[:friends]-(f)
WHERE a.name = 'A'
WITH a, COLLECT(f) AS fs

// Get all friends of friends (fof) who are not already known to 'A'
UNWIND fs AS f
MATCH (f)-[:friends*]-(fof)
WHERE NOT fof IN fs+a

// Count how many of each fof's friends are not already known to 'A'
WITH DISTINCT a, fs, fof
MATCH (fof)-[:friends]-(l)
WHERE NOT l IN fs+a
RETURN fof.name, COUNT(l)

Примечание. Для больших БД вы захотите установить разумную верхнюю границу для отношения переменной длины шаблон (f)-[:friends*]-(fof) чтобы запрос не занимал слишком много времени или не хватало памяти. Например, (f)-[:friends*..7]-(fof).

0 голосов
/ 26 февраля 2020

Я нашел решение при обращении к документации Neo4j.

match (a:users {userId:'1234'})-[e:friends]-(b:users)
with collect(b) as excluded
match (b:users)-[r:friends]-(fof:users)
with collect(fof) as fofCollect,excluded,fof,count(r) as relationCount
where none (fof in fofCollect where fof in excluded)
return fof.FIRST_NAME,fof.userId,relationCount
order by relationCount desc 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...