簡體   English   中英

Neo4j Cypher to C#如何基於參數值與其他節點創建不同的關系

[英]Neo4j Cypher to C# how to create different relationships with other nodes based on the value of a parameter

我正在嘗試創建這樣的東西:

Match (rt:Root{Name:root})
Match (o:Organization{orgName:"Org1"}) 
create (u:User{FirstName:"User1", UserRole:"is_member"}) 
CASE  
When u.UserRole="is_member" Then Create (u) -[:"is_member"] -> (o) 
ELSE u.UserRole="is_guest" Then Create (u) -[:"is_guest"] -> (o)
ELSE u.UserRole="is_admin" Then Create (u) -[:"is_admin"] -> (rt)

因此,根據UserRole,將在用戶和其他節點之間創建不同的關系。 由於某些原因,這在Neo4j中不起作用,並且在C#中是等效的

謝謝!

您有幾個語法錯誤。

以下查詢應該可以工作(注意:我選擇使用MERGE而不是CREATE以避免在重復相同查詢的情況下創建重復項):

MATCH (rt:Root{Name:root}), (o:Organization{orgName:"Org1"})
MERGE (u:User{FirstName:"User1", UserRole:"is_member"})
WITH rt, o, u,
  CASE u.UserRole
    WHEN "is_member" THEN {m: [1]}
    WHEN "is_guest"  THEN {g: [1]}
    WHEN "is_admin"  THEN {a: [1]}
  END AS todo
FOREACH(x IN todo.m | MERGE (u) -[:is_member]-> (o) )
FOREACH(x IN todo.g | MERGE (u) -[:is_guest]->  (o) )
FOREACH(x IN todo.a | MERGE (u) -[:is_admin]->  (rt) )

CASE表達式只能生成變量-它不能執行CREATEMERGE類的操作。 盡管上面的查詢還包含一個CASE子句,但它只是生成一個todo變量,其值可以是一個對象或NULL (如果不滿足WHEN測試)。

CASE表達式不同, FOREACH子句可以執行CREATEMERGE操作。 因此,上面的查詢有3個-但其中最多一個實際上會執行MERGE ,因為FOREACH(x IN todo.foo | ...)子句不執行任何操作,除非todo.foo存在且為非-空列表。 (我們不需要使用x變量,因此將忽略它​​們。)

另外:最近添加了APOC過程apoc.do.case ,理論上可以代替上面的CASEFOREACH方法使用。

暫無
暫無

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

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