0

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

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
4

1 回答 1

1

这里有几件事。

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

你有WITH requiredCount, c, u, count(u) as matches,它没有做你认为的那样。聚合函数具有来自非聚合列(形成分组键)的上下文。像这样读出它会有所帮助:“对于每个 requiredCount、c 和 u,给我那个 u 的计数”。每行只有 1u个,因此每行的matches计数始终为 1,因此只要名称集合大于 1,您的查询将始终失败。您可以通过将该行的 WITH 更改为 RETURN 并注释掉自己来测试它其余的部分。您将不得不通过收集u或从该行中删除它来以不同的方式处理它。

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

于 2017-12-21T11:16:39.190 回答