如何建立条件关系?

How to create conditional relationships?

我有一个系统是运行某个组织实现的某个功能,所以我有关系:

Organization → Function → System

但有时功能仍然未知,在这种情况下我想将系统直接绑定到组织:

Organization → System

这种东西怎么写?

系统包含用于创建这些关系的属性,例如

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})

...但是如何创建关系?

因为您总是有 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;

我找到了 Mark Needham 的 post:

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)
);