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