Neo4j Cypher替代路径

5

我正在使用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个回答

4
这是一个查询,每行应返回一个不同的A和它连接的所有不同的C节点集合,这些连接可以是您所述的任何一种方式(或两种方式都有)。
我假设A、B和C都是节点标签。
为了清晰地展示方法,这里是一个简化的查询,它不考虑属性值。
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的两侧)。希望这很清楚。


我一直专注于寻找一种表达“这个存在或者那个存在”的方式,以至于我甚至没有想到将路径e1-e2和边缘e3“折叠”到同一个元素中,然后使用WHERE子句来区分它们。 尽管我所举的例子过于简单化了我的问题,但我已经成功地将我能想象到的每个其他例子都带到了你所做的模式中。谢谢!=) - fgiacc
不用谢。我刚刚还简化了WHERE子句中的第二个条件。 - cybersam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接