[英]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表達式只能生成變量-它不能執行CREATE
或MERGE
類的操作。 盡管上面的查詢還包含一個CASE
子句,但它只是生成一個todo
變量,其值可以是一個對象或NULL
(如果不滿足WHEN
測試)。
與CASE
表達式不同, FOREACH子句可以執行CREATE
或MERGE
操作。 因此,上面的查詢有3個-但其中最多一個實際上會執行MERGE
,因為FOREACH(x IN todo.foo | ...)
子句不執行任何操作,除非todo.foo
存在且為非-空列表。 (我們不需要使用x
變量,因此將忽略它們。)
另外:最近添加了APOC過程apoc.do.case ,理論上可以代替上面的CASE
和FOREACH
方法使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.