我正在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毫秒。
结果:
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毫秒。
结果:
答案 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);