Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 带遍历的分组和排序_Neo4j - Fatal编程技术网

Neo4j 带遍历的分组和排序

Neo4j 带遍历的分组和排序,neo4j,Neo4j,我有两种类型的节点:城市和事件 城市可以举办许多活动,每个活动仅由一个城市主办 可以使用链接关系在它们之间链接事件(可以链接事件) 我想找到一个给定的城市,在这个城市主办的活动按链接事件分组 例如: Events happened in C1 : E1, E2, E3, E4 Events happened in C2 : Ew, Ex, Ey, Ez Events happened in C3 : Ea, Eb, Ec, Ed 链接: E1 -> Ew -> Ea -> E

我有两种类型的节点:城市和事件

城市可以举办许多活动,每个活动仅由一个城市主办

可以使用链接关系在它们之间链接事件(可以链接事件)

我想找到一个给定的城市,在这个城市主办的活动按链接事件分组

例如:

Events happened in C1 : E1, E2, E3, E4
Events happened in C2 : Ew, Ex, Ey, Ez
Events happened in C3 : Ea, Eb, Ec, Ed
链接:

E1 -> Ew -> Ea -> E2 -> Ex -> Ey
E3 -> Eb -> E4 -> Ez -> Ec -> Ed
我正在寻找返回的方法:

for C1 : [E1,E2], [E3,E4]
or for C2 : [Ew,Ex,Ey], [Ez]
or for C3 : [Eb,Ec,Ed], [Ea]

这可以通过遍历完成吗?

设置示例数据集:

MERGE (E1:Event { id: "E1" })
MERGE (E2:Event { id: "E2" })
MERGE (E3:Event { id: "E3" })
MERGE (E4:Event { id: "E4" })
MERGE (Ew:Event { id: "Ew" })
MERGE (Ex:Event { id: "Ex" })
MERGE (Ey:Event { id: "Ey" })
MERGE (Ez:Event { id: "Ez" })
MERGE (Ea:Event { id: "Ea" })
MERGE (Eb:Event { id: "Eb" })
MERGE (Ec:Event { id: "Ec" })
MERGE (Ed:Event { id: "Ed" })
MERGE (C1:Location { city: "C1" })
MERGE (C2:Location { city: "C2" })
MERGE (C3:Location { city: "C3" })
MERGE (C1)<-[:HAPPENED_IN]-(E1)
MERGE (C1)<-[:HAPPENED_IN]-(E2)
MERGE (C1)<-[:HAPPENED_IN]-(E3)
MERGE (C1)<-[:HAPPENED_IN]-(E4)
MERGE (C2)<-[:HAPPENED_IN]-(Ew)
MERGE (C2)<-[:HAPPENED_IN]-(Ex)
MERGE (C2)<-[:HAPPENED_IN]-(Ey)
MERGE (C2)<-[:HAPPENED_IN]-(Ez)
MERGE (C3)<-[:HAPPENED_IN]-(Ea)
MERGE (C3)<-[:HAPPENED_IN]-(Eb)
MERGE (C3)<-[:HAPPENED_IN]-(Ec)
MERGE (C3)<-[:HAPPENED_IN]-(Ed)
CREATE (E1)-[:LINKED]->(Ew)-[:LINKED]->(Ea)
CREATE (Ea)-[:LINKED]->(E2)-[:LINKED]->(Ex)-[:LINKED]->(Ey)
CREATE (E3)-[:LINKED]->(Eb)-[:LINKED]->(E4)
CREATE (E4)-[:LINKED]->(Ez)-[:LINKED]->(Ec)-[:LINKED]->(Ed)
C2的结果:

+------------------+
| events           |
+------------------+
| ["Ew","Ex","Ey"] |
| ["Ez"]           |
+------------------+
2 rows
37 ms
C3的结果:

+------------------+
| events           |
+------------------+
| ["Ea"]           |
| ["Eb","Ec","Ed"] |
+------------------+
2 rows
38 ms

也许您可以添加一个可视化的图形模型?一般来说,如果您想从Java API开始,只需使用node.getRelationships()等基本方法,然后从那里开始

你会怎么做

  • 每个城市
  • 把那个城市的所有活动都安排在一起
  • 从集合中选取第一个事件
  • 检查是否通过多个跃点(例如,使用最短路径)连接到城市中的其他事件,如果是,将所有连接的事件放入一个组中,并从原始集中删除所有连接的事件(它们仍然是群集,未连接到其他事件)
  • 设置为空时,输出城市的组,否则继续3

  • 谢谢Kenny的回答,但我希望使用Traversal API来实现。我已经做了一些类似于您的解决方案的工作。它工作得非常完美,但对于大量节点的性能不是很好。
    +------------------+
    | events           |
    +------------------+
    | ["Ew","Ex","Ey"] |
    | ["Ez"]           |
    +------------------+
    2 rows
    37 ms
    
    +------------------+
    | events           |
    +------------------+
    | ["Ea"]           |
    | ["Eb","Ec","Ed"] |
    +------------------+
    2 rows
    38 ms