首页 > 解决方案 > Neo4j 在查询中求和子结果

问题描述

我有一个与其他节点有 3 种不同关系的节点人。每个关系都有一个相关联的数字,表示该关系在图中的重要性。

这是我现在关注的模式的一部分(为了便于阅读,下面的查询是用英文写的。lavora_inworks_invive_conlives_withconosce知道的)

在此处输入图像描述

因此,对于每个人,我计算它具有某种关系的次数,然后将其乘以某个因子:

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 个函数,然后根据人的 id 在第四个函数中总结它们的结果

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

有什么建议么?

标签: neo4jsubquery

解决方案


您应该能够在单个查询中执行此操作,并通过使用关系度(我们可以从节点本身知道)而不是扩展和使用 count() 聚合来简化。最佳性能是当我们不需要了解另一端节点的任何信息时(否则它必须在另一个节点上展开和过滤),并且您的图形结构表明这些关系仅连接这些特定类型的节点而不连接其他节点.

下面是你如何做到这一点:

MATCH (p:Person)
RETURN p.id, size((p)-[:lives_with]-()) * 10 + 
             size((p)-[:works_in]-()) * 6 + 
             size((p)-[:knows]-()) * 4 as overallSum

推荐阅读