如何创建条件关系?

时间:2015-04-13 17:19:12

标签: neo4j cypher

我有一个由组织运行以实现某个功能的系统,因此我有这样的关系:

  

组织→功能→系统

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

  

组织→系统

我该怎么写这种东西?

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

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

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

2 个答案:

答案 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;