Neo4j сумма подрезультатов в запросе - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть человек-узел, который имеет 3 разных отношения с другими узлами. Каждое отношение имеет связанный номер, который показывает, насколько важно это отношение на графике.

Это часть схемы, на которую я сейчас обращаюсь (для удобства чтения запросы ниже написаны на английском языке sh. lavora_in - works_in , vive_con - life_with и conosce - знает )

enter image description here

Итак, для каждого человека я считаю количество раз, когда у него есть определенные отношения, и я умножаю его на определенный коэффициент:

match (p:Person) - [v:lives_with] - (p1:Person)
return p.id, (count(*)*10) as cnt 
match (p:Person) - [v:works_in] - (d:Division)
return p.id, (count(*)*6) as cnt 
match (p:Person) - [v:knows] - (p1:Person)
return p.id, (count(*)*4) as cnt 

Итак, в конце я получу 3 разных значения для каждого человека и хотел бы их суммировать. Я подумал о том, чтобы создать эти 3 функции и затем суммировать их результат на основе идентификатора человека в четвертой

match (p:Person)
set p.overallSum = // query1 + query2 + query3
return p.id, p.overallSum

Есть предложения?

1 Ответ

1 голос
/ 03 апреля 2020

Вы должны быть в состоянии сделать это в одном запросе и упростить, работая со степенями отношений (которые мы можем узнать из самого узла), вместо того, чтобы расширять и использовать агрегации count (). Наилучшая производительность - это когда нам не нужно ничего знать об узле на другом конце (в противном случае он должен расширяться и фильтроваться на другом узле), и ваша структура графа предполагает, что эти отношения соединяют только узлы этих указанных c типов. и никаких других.

Вот как вы это делаете:

MATCH (p:Person)
RETURN p.id, size((p)-[:lives_with]-()) * 10 + 
             size((p)-[:works_in]-()) * 6 + 
             size((p)-[:knows]-()) * 4 as overallSum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...