neo4j - Neo4j count() 返回不正确的值
问题描述
我有以下查询:
MATCH (ld:Lead{id:'50309649-f892-4819-aa31-e34f3844aecd'})-[:IS_IN]->(pc:PostCode)<-[:COVERS]-(advisor:User{userType:30, isApproved:true, isUnavailable:false})-[:HAS]->(q:Qualification)<-[:SUPPORTED_BY]-(advType:AdviceType)<-[:REQUIRES]-(ld)
WHERE NOT (ld)-[:IS_ALLOCATED_TO]->(advisor)
OPTIONAL MATCH (ldExisting:Lead)-[rAllocated:IS_ALLOCATED_TO]->(advisor) WHERE rAllocated.status = 0 OR rAllocated.status = 10
return advisor, COUNT(ldExisting) as existingCount
它返回一个“顾问”列表,并且还意味着返回每个顾问已经拥有的现有“IS_ALLOCATED_TO”关系的数量。
在我的数据库中,我创建了一个“IS_ALLOCATED_TO”关系。所以在这种情况下,它应该为受影响的顾问返回计数 1。但是,它返回的值为 3。
对此的任何想法都非常受欢迎。谢谢!
解决方案
请记住,MATCHes 会在图中找到所有匹配的模式。最有可能发生的事情是您的初始 MATCH 正在查找涉及同一advisor
节点的多个匹配项,因此您将有多行advisor
引用同一节点。鉴于您所说的图表中存在的计数,我猜advisor
在您的 OPTIONAL MATCH 执行之前,相同的节点值在 3 个单独的行上是相同的(您可以通过在RETURN advisor
OPTIONAL MATCH 之前执行并注释掉其余部分来检查)。
然后你的 OPTIONAL MATCH 执行,并且(像所有 Cypher 操作一样)它在所有行上执行,这意味着它从同一个advisor
节点执行相同的操作 3 次,遍历相同的关系,匹配到同一个ldExisting
节点,并为那些计算同一个节点3行,给你3的结果。
要解决此问题,您需要确保您正在使用 DISTINCT 节点advisor
,因此您不会有多个具有相同节点的行,如下所示:
MATCH (ld:Lead{id:'50309649-f892-4819-aa31-e34f3844aecd'})-[:IS_IN]->(pc:PostCode)<-[:COVERS]-(advisor:User{userType:30, isApproved:true, isUnavailable:false})-[:HAS]->(q:Qualification)<-[:SUPPORTED_BY]-(advType:AdviceType)<-[:REQUIRES]-(ld)
WHERE NOT (ld)-[:IS_ALLOCATED_TO]->(advisor)
WITH DISTINCT advisor
...
推荐阅读
- python-3.x - 如何使用用户输入将多个项目附加到列表中而不覆盖列表中已有的项目?
- javascript - Google Chrome Windows/iOS 桌面通知
- php - Laravel 排序错误
- python - 您如何使用面向对象编程在 Python 中对龟兔赛跑进行编程,更具体地说,我们如何让它们实际移动?
- json - 对 jq 中的值运行终端操作
- javascript - 如何在javascript中制作一个可以直接读取任何文件并用现有文本替换自身的函数?
- android-source - 使用 ftruncate(fd_out, GetSize()) 在 WSL 中编译 AOSP 失败:参数无效
- php - 您将如何向模态显示数据?
- c# - ASP.Net Core 3.0 依赖注入忽略工厂方法?
- r - dplyr 将列列表传递给函数以计算缺失