Neo4j Подсчитать самый подключенный родительский узел по заданному набору дочерних узлов - PullRequest
0 голосов
/ 26 декабря 2018

Скажем, у меня есть несколько деревьев:

A<-{D, E}<-F
B<-{E, G}
C<-{E, H}
//Where only A, B, and C are of (:parent{name:""})
//There rest is child

При заданном наборе дочерних узлов:

{E, F} //(:child{name:""})
//Clearly A is the most connected parent even if F is not directly connected to A

Вопрос: Как найти наиболее связанный родительский узел по коллекции дочерних узлов?Любой запрос шифра, функция плагина или процедура приветствуется.HELP.

Вот что я пробовал, но безуспешно, потому что он подсчитывает общее соотношение между двумя узлами:

MATCH (c:child)--(p:parent)
WHERE c.name IN ['E', 'F']
RETURN p ORDER BY size( (p)--(c) ) DESC LIMIT 1
//Also tried size( (p)--() ) but it count all relationship that the parent node has.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Концепция, которую вы упускаете, это шаблоны отношений переменной длины .С этим вы можете сопоставить из: дочерних узлов: вам нужно: родительские узлы на переменном расстоянии, затем подсчитать, сколько раз встречаются родительские узлы и взять верх:

MATCH (c:child)-[*]->(p:parent) // assumes only incoming rels toward :parent
WHERE c.name IN ['E', 'F'] // make sure you have an index on :child(name)
WITH p, count(p) as connected
RETURN p 
ORDER BY connected DESC 
LIMIT 1
0 голосов
/ 26 декабря 2018

Хорошо, поэтому я попробовал что-то еще, но не уверен, насколько эффективно работать с огромным графом (говорит 2M узлов +):

MATCH path= shortestPath( (c:child)--(p:parent) )
WHERE c.name IN [...]
WITH p, collect(path) as cnt
RETURN p, size(cnt) AS nchild
ORDER BY nchild DESC LIMIT 1

Есть ли мнения по этому поводу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...