【问题标题】:Group relations between two nodes两个节点之间的组关系
【发布时间】:2015-07-17 10:53:08
【问题描述】:

我有一个数据库,其中某些节点可以与多达 5 个不同的关系相关联。我正在尝试在 Cypher 中进行大型查询,但是重复的信息太多,而且我遇到了一些内存错误。

想象下图:

我得到的结果是:

(node1, r1, REL_A, node2)
(node1, r2, REL_B, node2)
(node1, r3, REL_C, node2)
(node1, r4, REL_D, node2)
(node1, r5, REL_E, node2)

我使用的查询如下所示:

MATCH (n:NODE_TYPE_A)-[d:REL1|REL2|REL3|REL4|REL5]->(p) RETURN DISTINCT n,d,type(d),p

有没有办法只返回一次 node1node2 以及所有关系的数组?这样结果会更小,我可以更好地处理它们而不会出现内存错误。

【问题讨论】:

  • 您尝试过使用 distinct 吗?

标签: neo4j cypher


【解决方案1】:

试试这个:

MATCH (n:NODE_TYPE_A)-[d:REL1|REL2|REL3|REL4|REL5]->(p) 
return n, collect(type(d)), p;

【讨论】:

  • 在您的第一种方法中,我仍然得到相同的输出。对于每个关系,每对节点和 ID 都会重复。至于第二个,虽然它会很棒,但每个关系都有一个我需要检索的属性,所以我需要所有的关系。这就是为什么我问这些关系是否可以分组到一个数组或类似的东西中。
  • 这似乎正是我所需要的!不幸的是,我收到了这个错误:Type mismatch: expected Collection<T> but was Relationship.
  • 可能只是一个标识符错误 - 对我有用,试试这个简单的示例以确保它是你想要的。数据:CREATE (a:x {x:1}), (b:x {x:2}) MERGE (a)-[:r1 {y:1}]->(b) MERGE (a)-[:r2 {y:2}]->(b) MERGE (a)-[:r3 {y:3}]->(b);
  • 查询:MATCH (a:x {x:1})-[r*]->(b:x {x:2}) return a.x,b.x,collect(extract(item in r | item.y));
  • 好的,再次更新答案——这次我明白了。我缺少可变路径长度,因此您根本不需要进行提取。只需收集类型。
猜你喜欢
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多