使用apoc在neo4j中进行条件查询

问题描述 投票:0回答:1

我试图在cypher中执行条件查询下面是我的示例查询,但即使条件为真,它也不会创建新的对话节点。

WITH ["Ram", "Shyam", "Hari"] as names
WITH names, size(names) AS requiredCount
MATCH (u:User) WHERE u.name IN names
WITH u, requiredCount
MATCH (u)-[:IS_PARTICIPANT]->(c:Conversation)
WITH requiredCount, c, u, count(u) as matches
WHERE requiredCount = matches and size(()-[:IS_PARTICIPANT]->(c)) = requiredCount
WITH u, count(c) as conversationExists
CALL apoc.do.when(conversationExists < 1, 'MERGE (cc:Conversation {_id: 
 apoc.create.uuid(), createdAt: timestamp()}) RETURN cc', '', {u: u}) YIELD value
RETURN value
neo4j cypher neo4j-apoc
1个回答
1
投票

这里有几件事。

names应该出现在第二行的WITH中(我认为你错误地将它重命名为userIDs)。

你有WITH requiredCount, c, u, count(u) as matches,这不符合你的想法。聚合函数具有来自非聚合列(形成分组键)的上下文。它可以帮助读出来:“对于每个requiredCount,c和u,给我那个你的计数”。每行只有1个u,因此每行matches计数总是1,因此只要名称集合大于1,您的查询就会失败。您可以通过将WITH更改为该行的WITH来自行测试,并且评论其余的。你将不得不通过收集u或从那条线上删除它来区别对待。

您还必须小心执行不匹配的MATCH或使用评估为false的WITH子句的WHERE子句,因为如果消除所有行,您将无法继续查询(基本上如果您的MATCH和如果失败,你根本无法到达这条线:WITH u, count(c) as conversationExists)。您可以尝试使用OPTIONAL MATCH,或者在WITH子句中将WHERE子句作为布尔变量提取出来。

© www.soinside.com 2019 - 2024. All rights reserved.