我有一个关于使用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