我正在使用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都存在,但事实并非如此。但是,如果我不为这些关系提供某些标识符,那么我将无法搜索它们的任何属性。

如何建立此查询?

谢谢。

最佳答案

这是一条查询,该查询应以您陈述的一种或两种方式在每行中返回一个不同的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的任一侧)中的两个术语。我希望这是清楚的。

关于Neo4j Cypher替代路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28370571/

10-11 03:53