繁体   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