neo4j - Neo4j 在查询中求和子结果
问题描述
我有一个与其他节点有 3 种不同关系的节点人。每个关系都有一个相关联的数字,表示该关系在图中的重要性。
这是我现在关注的模式的一部分(为了便于阅读,下面的查询是用英文写的。lavora_in是works_in,vive_con是lives_with,conosce是知道的)
因此,对于每个人,我计算它具有某种关系的次数,然后将其乘以某个因子:
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
有什么建议么?
解决方案
您应该能够在单个查询中执行此操作,并通过使用关系度(我们可以从节点本身知道)而不是扩展和使用 count() 聚合来简化。最佳性能是当我们不需要了解另一端节点的任何信息时(否则它必须在另一个节点上展开和过滤),并且您的图形结构表明这些关系仅连接这些特定类型的节点而不连接其他节点.
下面是你如何做到这一点:
MATCH (p:Person)
RETURN p.id, size((p)-[:lives_with]-()) * 10 +
size((p)-[:works_in]-()) * 6 +
size((p)-[:knows]-()) * 4 as overallSum
推荐阅读
- ember.js - Ember:如何通过参数传递多个参数以路由
- javascript - 我可以使用布尔值来解决这个问题吗?
- python - Lambda 事件返回空对象
- mongodb - 使用 min 验证器验证 mongoose 编号字段
- python - python-gdb 错误:Python 异常
类型没有目标 - android - Android杀死小米、华为等后台服务
- angular - ngClass 根据条件仅工作一次,如何使用连续变化的值应用类
- macos - 内存泄漏 Xamarin React 绑定
- selenium - 想要点击 naukri.com 中的第一份工作链接以获取任何关键字,例如通过 selenium 说 java,但它给了我错误
- python - 需要将字典值附加到字典