匹配查询在CYPHER中花费太多时间

时间:2016-07-14 13:53:41

标签: neo4j cypher

我正在CYPHER处理不同的查询,我的LayerGroup查询需要花费太多时间。

查询:

Match

Facebook上有20117个节点,FacebookComment有6054个节点。

执行需要8分半钟。

在查询或其他任何方面可能会出现什么问题?

修改

我在密码查询中运行 PROFILE

MATCH (a:FacebookComment), (b:FacebookLike)

WHERE a.post_id > 696
AND
a.post_id < 746 
AND 
a.id = toint(b.comment_id)

CREATE (a) <-[fpl:FB_COMMENT_LIKE]-(b)

花了808676毫秒。

结果:

enter image description here

Cypher查询:

PROFILE 
Match (a:FacebookComment) WHERE a.post_id > 696 AND a.post_id < 746 with a
Match (b:FacebookLike) WHERE a.id = toint(b.comment_id) with b, a
MERGE (a)<-[fpl:FB_COMMENT_LIKE]-(b)

花了800793毫秒。

结果:

enter image description here

1 个答案:

答案 0 :(得分:2)

在执行这些类型的查询以创建关系时,您可能无法逃避长时间的执行,当您拥有所有ID时,设置关系并且外键可能需要一些时间。也就是说,这里有一些很好的改进机会。

特别有问题的是toInt()你需要做的:FacebookLike comment_id ...这意味着你不能在这里利用索引。你可以在你的PROFILE中看到笛卡尔积之后的滤波器操作,它的命中率为3.72亿db;为了进行id比较,它必须迭代每一个:FacebookLike,将id更改为int,然后进行比较。这是查询中最昂贵的部分。

如果:FacebookLike comment_id已经是一个int(也就是说,如果不需要toInt(),并且你错误地将它留在了里面),或者你需要花一些时间来改变它们:FacebookLike comment_id到一个int前面当时,您应该看到该过滤器的重大改进。

这也假设您在两者上创建索引:FacebookComment.post_id和:FacebookLike.comment_id。 (另外,请确保您正在使用正确的字段...您的查询中有post_ids,comment_ids和id,可能很容易混淆)。

至于其他改进(在您解决了上面的大问题之后),将您的查询分解为多个部分将帮助您避免使用笛卡尔积。

完整查询可能如下所示:

Clip clip = AudioSystem.getClip();
AudioInputStream a = AudioSystem.getAudioInputStream(new File(path));
clip.open(a);