[英]Conditional query in neo4j using apoc
我試圖在cypher中執行條件查詢以下是我的示例查詢,但是即使條件為true,它也不會創建新的對話節點。
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
這里有兩件事。
names
應該出現在第二行的WITH中(我認為您錯誤地將其重命名為userIDs
)。
您有WITH requiredCount, c, u, count(u) as matches
,這並沒有按照您的想象做。 聚合功能具有來自非聚合列(構成分組鍵)的上下文。 這樣可以幫助讀出:“對於每個requiredCount,c和u,請給我該u的計數”。 每行只有1 u
,因此每行的matches
計數始終為1,因此只要您的名稱集合大於1,查詢就會始終失敗。您可以通過將該行的WITH更改為RETURN來自己進行測試,然后注釋掉其余的。 您將不得不以不同的方式處理此問題,方法是收集u
或將其從該行中刪除。
您還必須小心執行與某項不匹配的MATCH,或在評估為false的WITH子句上使用WHERE子句,因為如果這樣會擦除所有行,則您將無法繼續查詢(基本上,如果MATCH和在失敗的地方,您將根本無法到達此行: WITH u, count(c) as conversationExists
)。 您可以嘗試使用OPTIONAL MATCH,也可以嘗試將WHERE子句提取為WITH子句中的布爾變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.