我正在使用Cypher,我需要构建一个类似于后面的查询
(A) ----e1----(B)
\ |
\ |
e3 e2
\ |
\ |
(C)
Run Code Online (Sandbox Code Playgroud)
其中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)
Run Code Online (Sandbox Code Playgroud)
但这样做我告诉Neo4j我想要(e1和e3)和e2都存在,而事实并非如此.但如果我不给这些关系一些标识符,我就无法搜索它们的任何属性.
我该如何构建此查询?
谢谢.
这是一个查询,应以您所陈述的任一(或两者)方式在每一行中返回一个不同的 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
Run Code Online (Sandbox Code Playgroud)
为了对属性值执行测试,您需要修改子句中的两个术语WHERE(位于 的两侧OR)。我希望这一点很清楚。