首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将节点和关系组合成单个列的cypher

将节点和关系组合成单个列的cypher
EN

Stack Overflow用户
提问于 2017-04-24 14:26:39
回答 1查看 2.3K关注 0票数 2

因此,作为这个问题的一个并发症,我基本上想做

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-24 14:42:25

有几种方法可以处理这个问题,这取决于您想要在列表中或映射中保存这些信息,或者希望节点的映射投影包含它的关系。

如果您使用的是Neo4j 3.1或更高版本,那么地图投影可能是最简单的方法。使用此方法,我们可以输出节点的属性,并将其关系包含为收集的属性:

代码语言:javascript
复制
MATCH (n:TEST) 
OPTIONAL MATCH (n)-[r]->() 
RETURN n {.*, rels:collect(r)} as n

如果您希望每一行都是它自己的节点配对,并将它的单个关系作为一个列表,那么您可以这样做:

代码语言:javascript
复制
...
RETURN [n, r] as pair

作为一张地图:

代码语言:javascript
复制
...
RETURN {node:n, rel:r} as pair

编辑

至于从每个关系返回更多数据,如果您检查code选项卡,您将看到id、关系类型以及开始和结束节点id都包括在内,并且可以从后端代码中访问。

但是,如果您想显式地返回这些数据,那么我们只需要在查询中包含它,对每个关系使用另一个映射投影:

代码语言:javascript
复制
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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43590778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档