从 Cypher (Neo4j) 中的 Id 列表中返回大型子图



我有一个关于使用Java的Neo4j客户端的问题。我有一个包含大约 120.000.000 个节点和 1.000.000.000 条边的图形。从这个图中,我想提取子图(平均大小约为 500 个节点(。为此,我在节点的 Id 字段上创建了一个索引。 查询如下所示

MATCH (a:XXX:YYYY) 
WHERE a.uid IN [9999, 5555, 7777, 99999, ...] 
RETURN a AS blablubb

目前,我正在寻找第二个查询的边缘,如下所示

MATCH (a::XXX:YYYY)-[r:ZZZZ]-(b::XXX:YYYY)
WHERE a.uid IN [9999, 5555, 7777, 99999, ...]
AND b.uid IN [9999, 5555, 7777, 99999, ...]

这是非常非常慢的,特别是当子图变大时。 我现在的问题是,如何连接两个查询以同时获取子图的边和节点。我知道有一个更快的解决方案,因为 Neo4j 浏览器给了我一个 可视化

MATCH (a:XXX:YYYY) 
WHERE a.uid IN [9999, 5555, 7777, 99999, ...] 
RETURN a AS blablubb

包含所有边缘。

非常感谢您的帮助

我将查询分为两个不同的查询。第一个获取节点

MATCH (a:XXX:YYYY) 
WHERE a.uid IN [9999, 5555, 7777, 99999, ...] 
RETURN a AS node

第二个

MATCH (n:Uid)
WHERE n.uid IN [9999, 5555, 7777, 99999, ...]
WITH collect(n) AS nds
UNWIND nds AS n1
MATCH (n1)-[r]-(n2)
WHERE n2 IN nds
RETURN r AS relation

边缘。出于某种原因,当我尝试将两者结合起来并获取边缘列表和节点列表时,它会变得非常慢。整体解决方案不是很令人满意,但至少我能够存档可接受的性能。

这是你自己答案的一个更简单、更有效的版本:

WITH [9999, 5555, 7777, 99999, ...] AS wanted
MATCH (n:Uid)-[r]->(n2)
WHERE n.uid IN wanted AND n2 IN wanted
RETURN r AS relation

如果将wanted作为参数传入,则查询将为:

MATCH (n:Uid)-[r]->(n2)
WHERE n.uid IN $wanted AND n2 IN $wanted
RETURN r AS relation

最新更新