Neo4j中的Collect非常慢

时间:2018-08-15 19:32:16

标签: neo4j collect

如何在2.2B节点上使用集合来汇总带有标签的ID对?我想滚动两个uid的平面列表,并用标签将它们连接起来而不重复。 我在neo4j中有一个图形,该图形由10个ID,9个连接ID和1个第一方ID组成。

我正在尝试创建一个查询,该查询针对由一个或多个连接ID连接的每对第一方ID,我列出了哪些第三方ID正在连接它们。

现在我有一个查询,如下所示:

Match (u:User)-[]->(id)
match (id)<-[]-(u2:User)
where u <> u2 and ID(u) < ID(u2)
return u.uid,u2.uid,labels(id)
limit 100

返回一个u,u1标签列表,使其看起来像

u|u2|labels
uid1|uid2|["label1"] 
uid2|uid3|["label2"]
uid1|uid2|["label2"]

我想做的就是将列表汇总成类似

的集合
Match (u:User)-[]->(id)
match (id)<-[]-(u2:User)
where u <> u2 and ID(u) < ID(u2)
return u.uid,u2.uid,collect(labels(id))
limit 100

但是它非常慢,并且冻结了我的浏览器。我正在244 GB EC2上使用163 GB数据集,并且已给出

dbms.memory.heap.initial_size=150g
dbms.memory.heap.max_size=150g
dbms.memory.pagecache.size=60g

1 个答案:

答案 0 :(得分:1)

问题在于collect()聚合将要求首先实现所有结果,因此LIMIT仅在最后成为过滤器,这与您的数据库大小无关。

由于您的限制应仅真正适用于具有该模式的不同节点对(无论它们之间有多少个公共节点),因此最好在您执行以下操作后将LIMIT上移并找到它们之间的公共节点(及其标签)。重新使用限量100套。

尝试一下:

MATCH (u:User)-->()<--(u2:User)
WHERE ID(u) < ID(u2)
WITH DISTINCT u, u2
LIMIT 100
RETURN u, u2, [(u)-->(id)<--(u2) | labels(id)] as idLabels

我们最后使用的是模式理解,但是您可以轻松地完成MATCH和collect()。