Neo4j Cypher的替代路径

时间:2015-02-06 16:40:58

标签: neo4j cypher

我使用Cypher,我需要构建一个类似

之类的查询
(A) ----e1----(B)
   \           |
     \         |
       e3      e2
         \     |
           \   |
             (C)

其中A,B和C是节点,e1,e2和e3关系分别连接A和B,B和C以及A​​和C.

我感兴趣的是节点A和C.当e1,B和e2存在(并且尊重某些属性)或关系e3存在(并且尊重某些属性)或两者时,该模式应该匹配。我的问题是我无法用Cypher语言转换它。 为了给关系一个标识符,我需要在MATCH子句中指定它,比如

MATCH (A)--[e1]--(B)--[e2]--(C), (A)--[e3]--(C)

但这样做我告诉Neo4j我想要(e1和e3)和e2都存在,而事实并非如此。但如果我不给这些关系一些标识符,我就无法搜索他们的任何属性。

如何构建此查询?

感谢。

1 个答案:

答案 0 :(得分:4)

这是一个查询,它应该在每一行中以一种(或两种)你所声明的方式返回一个不同的A和它所连接的所有不同C节点的集合。

我认为ABC都是节点标签。

为了清楚地显示方法,这里是一个简化的查询,不查看属性值

MATCH p=(a:A)-[e*1..2]-(c:C)
WITH p, a, c, RELATIONSHIPS(p) AS rels
WHERE LENGTH(rels) = 1 OR HEAD(TAIL(NODES(p))):B
RETURN a, COLLECT(DISTINCT c) AS cs

为了对属性值执行测试,您需要修改WHERE子句中的两个术语(OR的任一侧)。我希望这很清楚。