我有以下查询:
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。
对此最欢迎的任何想法。谢谢!
答案 0 :(得分:1)
请记住,MATCH将在图中找到所有匹配的模式。最有可能发生的事情是您的初始MATCH正在查找涉及同一advisor
节点的多个匹配项,因此您将有多个行,其中advisor
指向同一节点。给定您所说的图形中存在的计数,我猜测在执行OPTIONAL MATCH之前,相同的advisor
节点值在3个单独的行中是相同的(您可以通过执行{{1} },然后注释掉其余的内容。
然后,您的OPTIONAL MATCH执行,并且(与所有Cypher操作一样)它在所有行上执行,这意味着它将在相同的RETURN advisor
节点上执行3次相同的操作,遍历相同的关系,并与相同的{ {1}}节点,并为这3行计数相同的节点,得出3的结果。
要解决此问题,您需要确保您正在使用advisor
的DISTINCT节点,这样您的同一个节点就不会有多行,就像这样:
ldExisting