簡體   English   中英

Neo4j Cypher-條件With子句查詢

[英]Neo4j Cypher- Conditional With clause query

我正在編寫下面的Neo4j Cypher查詢來添加新的Part並從Vehicle節點中刪除舊的Part 我正在使用Neo4j(版本3.4.1)

newPartsremovedParts是我的參數。 它們是String列表。

with {newParts} AS newParts
unwind newParts as newPart
match (r:Vehicle) where id(r)=639
merge (r)-[:HAS_PART]->(np:Part{name:newPart})
on create np+={lastModifiedDateTime:localdatetime(), createdDateTime:localdatetime()}
with r optional match (r)-[rel:HAS_PART]-(p:Part) where p.name in {removedParts}
delete rel
with r match q=(r)--()
return nodes(q), relationships(q))

當我將newParts參數提供為非空時,它工作正常。

但是當它為空時,我不會回到我的最終節點和關系。 我明白為什么會發生這種情況,因為當列表為空時,展開會停止執行。 我試着動with..unwind部之下del它成功地刪除removedParts Part 然而,它不會返回最后的節點和關系,因為它們在放松之后。

我不知道如何使用空的newParts參數來完成這項工作。 我試圖使用case但我認為case不適用於節點和關系。

任何幫助或指示將受到高度贊賞。

提前致謝

V

理念

您可以將APOC用戶庫條件密碼執行與參數newParts的非空檢查結合使用。 apoc.do.when選擇apoc.do.when over apoc.when因為它是在讀/寫上下文中執行的,這對於MERGE子句是必需的。

提出的解決方案

WITH $newParts AS newParts, $removedParts AS removedParts
CALL apoc.do.when(
size($newParts) > 0,
// true case
'
  UNWIND newParts AS newPart
  MATCH (r:Vehicle) WHERE id(r)=639
  MERGE (r)-[:HAS_PART]->(np:Part{name:newPart})
  ON CREATE np+={lastModifiedDateTime:localdatetime(), createdDateTime:localdatetime()}
  RETURN r;
',
// false case
'
  UNWIND newParts AS newPart
  MATCH (r:Vehicle) WHERE id(r)=639
  RETURN r;
',
{newParts: newParts}) YIELD value AS result
WITH DISTINCT result.r AS r, removedParts
OPTIONAL MATCH (r)-[rel:HAS_PART]-(p:Part) WHERE p.name IN removedParts
DELETE rel
WITH DISTINCT r 
MATCH q=(r)--()
RETURN nodes(q), relationships(q);

說明

  • 第2行:調用APOC用戶庫的if-then-else結構
  • 第3行:要評估的條件,在這種情況下檢查參數newParts是否為空
  • 第5-11行:if部分,交出Vehicle r
  • 第13-17行:其他部分
  • 第18行:定義必須提供給if-then-else構造的參數並從中檢索結果

由於Neo4j管理員對Neo4j松弛頻道的建議和建議,我能夠為自己的問題找到答案。

如果您想使用普通的Cypher查詢,可以使用以下答案:

MATCH (r:Vehicle) WHERE id(r)=639
FOREACH(newPart IN {newParts}| 
MERGE (np:Part{id:newPart})
ON CREATE SET np+={partProperties}
MERGE (r)-[:HAS_PART]->(np))
WITH DISTINCT r SET r+={vehicleProperties} 
WITH DISTINCT r OPTIONAL MATCH p=(r)-[rel:HAS_PART]-(p:Part) where p.name in {removedParts} 
DELETE rel 
WITH DISTINCT r 
MATCH q=(r)--() 
RETURN q

希望有人覺得它有用!

問候,V

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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