Neo4J匹配和创建关系非常慢,有数百万张记录



我的标签A大约350万节点,大约有400个节点,标签b。

标签B节点已经已经有了指示关系,例如(b1:B)-(c:CONNECTS)->(b2:B),现在我需要通过将节点属性与:CONNECTS关系属性进行比较。

我的陈述看起来像这样:

MATCH (a:A)
MATCH (c:C)
MATCH (b1:B {id: a.a1_id})-[rl:CONNECTS*1..21]->(b2:B {id: a.b2_id}) WHERE ALL(x in rl WHERE x.connect_id = c.connect_id)
MATCH (new_a:B)-[r:TO]->(new_b:B) WHERE r in rl
CREATE (new_a)-[:TICKET {ticket_id: ID(a)}]->(new_b)

此陈述非常慢,只是挂断了。我什至尝试在此处提到一些性能调整,尤其是我将堆尺寸分配给16GB。

我发现它无法处理这种大小的数据非常奇怪。我想念什么?我试图以不同的方式建模并减少关系查询并使用更多的模式索引,但是由于我拥有的数据类型以及所有数据都在所有数据之后,我想执行的查询类型,但我没有做很多不同的方法。

我还试图在使用CSV导入创建一个节点时使用定期提交。它有同样的问题。

我希望我足够清楚。我真的很感谢一些投入。谢谢。

标签A,B,C是什么?连接关系也没有意义。这样的查询本来是可以理解的,而不是相反!

// generates 3.5M rows
MATCH (a:A)
// generates x-times 3.5M rows
// you never use that C except for checking an connect id?
MATCH (c:C)
// many million times execute this variable length expand
MATCH (b1:B {id: a.a1_id})-[rl:CONNECTS*1..21]->(b2:B {id: b2_id}) 
WHERE ALL(x in rl WHERE x.connect_id = c.connect_id)
// lookup by relationship is very bad esp. as you looking over a cross product of all 400x400 B's
MATCH (new_a:B)-[r:TO]->(new_b:B) WHERE r in rl
// why do you store the id of a on this self!!-relationship?
CREATE (new_b)-[:TICKET {ticket_id: ID(a)}]->(new_b);

b2_id从哪里?

也许这样的东西:

MATCH (a:A)
MATCH (b1:B {id: a.a1_id})
MATCH (b2:B {id: {b2_id}})
MATCH (b1)-[rels:CONNECTS*..21]->(b2)
WHERE ALL(x in tail(rels) WHERE x.connect_id = head(rels).connect_id)
UNWIND rels AS r
WITH a,startNode(r) as new_a, endNode(r) as new_b
CREATE (new_a)-[:TICKET {ticket_id: ID(a)}]->(new_b);

最新更新