我有一个由组织运行以实现某个功能的系统,因此我有这样的关系:
组织→功能→系统
但有时功能仍然未知,在这种情况下,我想将系统直接绑定到组织:
组织→系统
我该怎么写这种东西?
系统包含用于创建这些关系的属性,例如
create (s:System {id: 'x', Organization: 'MST', Function: 'CM'})
或
create (s:System {id: 'x', Organization: 'MST'})
这意味着我可以找到这样的节点:
match (s:System), (o:Organization {Code: s.Organization})
optional match (f:Function {Code: s.Function})
...但我如何创建关系?
答案 0 :(得分:1)
我找到了Mark Needham的帖子:
http://www.markhneedham.com/blog/2014/06/17/neo4j-load-csv-handling-conditionals/
...它提供了一种曲折的语法,但提供了一个解决方案。有没有更好的方法来实现这一目标?
match (s:System), (o:Organization {Code: s.Organization})
optional match (d:Function {Code: s.Function})
foreach (n in (case when s.Function is null then [1] else [] end) |
create (o)-[:Runs]->(s)
)
foreach (n in (case when s.Function is not null then [1] else [] end) |
create (o)-[:Function]->(f)-[:SupportedBy]->(s)
);
答案 1 :(得分:0)
由于您始终拥有System
个节点,因此您可以重新安排数据模型,使其看起来像这样
(:Org {Code: 1})-[:HAS_SYSTEM]->(:System {id: 2})-[:HAS_FUNCTION]->(:Function {Code: 3})
HAS_FUNCTION
关系和Function
节点是可选的。
因此,如果您想找到具有功能代码3的组织代码1的系统,您可以这样做:
MATCH (:Org {Code: 1})-[:HAS_SYSTEM]->(s:System)-[:HAS_FUNCTION]->(:Function {Code: 3})
RETURN s;