所以作为这个问题的复杂性,我基本上想做
MATCH (n:TEST) OPTIONAL MATCH (n)-[r]->() RETURN DISTINCT n, r
我想将 n 和 r 作为没有重复值的一列返回。然而,运行
MATCH (n:TEST) OPTIONAL MATCH (n)-[r]->() UNWIND n+r AS x RETURN DISTINCT x
给出“类型不匹配:预期列表但关系(第 1 行,第 47 列)”错误。而这个查询
MATCH (n:TEST) RETURN DISTINCT n UNION MATCH ()-[n]->() RETURN DISTINCT n
将节点和关系放在同一列中,但第一场比赛的上下文在下半场丢失。
那么如何将所有匹配的节点和关系作为一个最小列表返回?
更新:
这是我正在使用的答案查询的最终修改版本
MATCH (n:TEST)
OPTIONAL MATCH (n)-[r]->()
RETURN n {.*, rels:collect(r {properties:properties(r), id:id(r), type:type(r), startNode:id(startNode(r)), endNode:id(endNode(r))})} as n
有几种方法可以解决这个问题,具体取决于您是希望将它们保存在列表中还是地图中,或者您是否希望节点的地图投影包含其关系。
如果您使用的是 Neo4j 3.1 或更新版本,那么地图投影可能是最简单的方法。使用它,我们可以输出节点的属性并将其关系包含为收集的属性:
MATCH (n:TEST)
OPTIONAL MATCH (n)-[r]->()
RETURN n {.*, rels:collect(r)} as n
Run Code Online (Sandbox Code Playgroud)
如果您希望每一行都成为它自己的一个节点配对和一个作为列表的单个关系,您可以这样做:
...
RETURN [n, r] as pair
Run Code Online (Sandbox Code Playgroud)
作为地图:
...
RETURN {node:n, rel:r} as pair
Run Code Online (Sandbox Code Playgroud)
编辑
至于从每个关系返回更多数据,如果您检查代码结果选项卡,您将看到 id、关系类型以及开始和结束节点 id 都包含在内,并且可以从您的后端代码访问。
然而,如果你想显式地返回这些数据,那么我们只需要将它包含在查询中,为每个关系使用另一个地图投影:
MATCH (n:TEST)
OPTIONAL MATCH (n)-[r]->()
RETURN n {.*, rels:collect(r {.*, id:id(r), type:type(r), startNode:startNode(r), endNode:endNode(r)})} as n
Run Code Online (Sandbox Code Playgroud)