簡體   English   中英

使用apoc在neo4j中進行條件查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM