Cypher将节点和关系组合到单列中



因此,作为这个问题的复杂性,我基本上想做

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或更新,则MAP投影可能是最简单的方法。使用此情况,我们可以输出节点的属性,并将其关系作为收集的属性包括在内:

MATCH (n:TEST) 
OPTIONAL MATCH (n)-[r]->() 
RETURN n {.*, rels:collect(r)} as n

,如果您希望每一行都是自己的节点的配对,而单一的关系是列表:

...
RETURN [n, r] as pair

作为地图:

...
RETURN {node:n, rel:r} as pair

编辑

,就每种关系返回更多数据,如果您选中"代码结果"选项卡,您会看到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

最新更新