Neo4j count()返回不正确的值

时间:2018-07-31 05:13:27

标签: neo4j cypher

我有以下查询:

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。

对此最欢迎的任何想法。谢谢!

1 个答案:

答案 0 :(得分:1)

请记住,MATCH将在图中找到所有匹配的模式。最有可能发生的事情是您的初始MATCH正在查找涉及同一advisor节点的多个匹配项,因此您将有多个行,其中advisor指向同一节点。给定您所说的图形中存在的计数,我猜测在执行OPTIONAL MATCH之前,相同的advisor节点值在3个单独的行中是相同的(您可以通过执行{{1} },然后注释掉其余的内容。

然后,您的OPTIONAL MATCH执行,并且(与所有Cypher操作一样)它在所有行上执行,这意味着它将在相同的RETURN advisor节点上执行3次相同的操作,遍历相同的关系,并与相同的{ {1}}节点,并为这3行计数相同的节点,得出3的结果。

要解决此问题,您需要确保您正在使用advisor的DISTINCT节点,这样您的同一个节点就不会有多行,就像这样:

ldExisting
相关问题