首页 > 解决方案 > 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。

对此的任何想法都非常受欢迎。谢谢!

标签: neo4jcypher

解决方案


请记住,MATCHes 会在图中找到所有匹配的模式。最有可能发生的事情是您的初始 MATCH 正在查找涉及同一advisor节点的多个匹配项,因此您将有多行advisor引用同一节点。鉴于您所说的图表中存在的计数,我猜advisor在您的 OPTIONAL MATCH 执行之前,相同的节点值在 3 个单独的行上是相同的(您可以通过在RETURN advisorOPTIONAL 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
...

推荐阅读