首页 文章

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

提问于
浏览
0

我试图在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

1 回答

  • 1

    这里有几件事 .

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

    你有 WITH requiredCount, c, u, count(u) as matches ,这不符合你的想法 . 聚合函数具有来自非聚合列(形成分组键)的上下文 . 它可以帮助读出来像这样:"for each requiredCount, c, and u, give me the count of that u" . 每行只有1 u ,因此每行的 matches count始终为1,因此只要名称集合大于1,您的查询将始终失败 . 您可以通过将该行的WITH更改为RET来自行测试,并且评论其余的 . 您将不得不以不同方式处理此问题,方法是收集 u 或从该行中删除它 .

    您还必须小心执行不能继续查询的MATCH(基本上如果您的MATCH和WHERE失败,您根本无法到达此行: WITH u, count(c) as conversationExists ) . 您可以尝试使用OPTIONAL MATCH,或者将WHERE子句作为WITH子句中的布尔变量提取出来 .

相关问题