加入Cypher查询?

时间:2017-06-21 21:25:11

标签: neo4j cypher

我似乎无法正确理解OPTIONAL MATCH。

我有一个始终存在的节点(t)。该节点(t)可以与其他节点(q),(o)有关系 - 可能与它们两者或仅仅是其中之一。

我试图在一个声明中找到类似

的声明

“显示node(t)的所有信息,如果有相关节点(o),那么还有(o)所有,如果有节点(q),那么也为(q) - 如果其中一个没有显示你有什么“

我可以选择匹配和可选匹配(如

MATCH (t) -- (o) WHERE t.id = "1234" 
OPTIONAL MATCH (t) -- (q) 
RETURN q,t,o

当我在(t)和(o)之间有一条路径时,无论我是否有(q),我都会成功。但是当我没有(o)而且有(q)时我失败了。如果我切换并将(q)放在第一行,((o)在第二行,反之亦然,我总是松开其中一个。

我怎样才能查询得到(o),(q)或其中一个,无论它们中哪一个存在?

修改

  1. 所有节点(t),(o)和(q)都有其他标签
  2. 我没有以正确的方式提出查询,因为我认为这无关紧要,所以失败的查询是 MATCH(o:Label3) - (t:Label1)WHERE t.id =“1234” 可选匹配(q:Label2) - (t:Label1) 返回q,t,o

2 个答案:

答案 0 :(得分:2)

如果您只想获取连接到t的所有节点的集合:

MATCH (t) WHERE t.id = "1234"
OPTIONAL MATCH (t) -- (o)
RETURN t, COLLECT(o) AS others;

答案 1 :(得分:1)

  

"显示node(t)的所有信息以及是否存在相关节点   (o)然后也是(o)的全部,如果有节点(q)那么也是(q)    - 如果其中一个不可用,则显示您拥有的内容"

如果oq具有唯一ID,则可以使用两个OPTIONAL MATH执行此操作。这样:

MATCH (t) WHERE t.id = "1234"
OPTIONAL MATCH (t) -- (o {id:567})
OPTIONAL MATCH (t) -- (q {id:568}) 
RETURN q,t,o