2017-04-24 78 views
2

所以,作为一个并发症合并成一个单一的列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

提出节点和关系在同一列,而是从第一场比赛的情况下在下半场丢失。

所以,我怎么能返回所有匹配的节点和关系为一个最小的名单?

UPDATE:

这就是答案查询的最终修改后的版本,我使用

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

回答

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 
+0

最后2它们合并成1列,但它只是一种格式变化,而节点信息是返回关系时间。第一个查询做我想要的,但关系标签(和结束节点)丢失。有没有办法让整个关系节点成为价值的一部分? (我需要的ID,开始,结束,标签/类型,并从关系属性) – Tezra

+0

增加了一个查询应该做的伎俩 – InverseFalcon

+0

好了,我可以用开始和结束节点上的ID()函数(这些节点也会被返回,所以不止是重复的信息);只是最后一件事。类型字段可能会被重载,所以我需要将属性降低到“属性”字段以保持其清洁。看来我不能只是做“属性:”。*“那么我该如何解决这个问题? – Tezra

相关问题