用于将节点和关系组合到单个列中的密码

时间:2017-04-24 14:26:40

标签: neo4j cypher

所以作为this question的一个复杂因素,我基本上想做

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

1 个答案:

答案 0 :(得分:4)

有几种方法可以处理这种情况,具体取决于您是希望在列表中还是在地图中保存这些内容,或者您​​希望节点的地图投影包含其关系。

如果您使用的是Neo4j 3.1或更新,那么map projection可能是最简单的方法。使用它,我们可以输出节点的属性并将其关系包含为收集的属性:

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