【问题标题】:Very heavy cypher MATCH query非常繁重的密码匹配查询
【发布时间】:2016-03-06 18:40:54
【问题描述】:

我有不同类型的节点和边的图表。我想获取两个节点(索引 WORD)之间的所有路径,这些节点通过属性 edgeLevel=1 的边(关系 NEXT_WORD)连接。我不想获得“edgeLevel!= 1”的连接。我写了一个查询

MATCH p=(a:WORD{wholeWord:"are"})-[r:NEXT_WORD*1..3{edgeLevel:1}]->(b:WORD{wholeWord: "you"}) RETURN length(p);

但它很重。我试图弄清楚如何优化这个密码查询,但我不知道。有没有更快、更轻的方法来做到这一点?此查询在 7931 毫秒内返回 32 行。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您似乎已经在:WORD(wholeWord) 上建立了索引。但是,您的查询没有使用索引来查找ab。这个查询应该更快:

    MATCH p=(a:WORD { wholeWord:"are" })-[r:NEXT_WORD*..3 {edgeLevel:1}]->(b:WORD { wholeWord: "you" })
    USING INDEX a:WORD(wholeWord)
    USING INDEX b:WORD(wholeWord)
    RETURN length(p);
    

    但是,如果您的关系不需要特定的属性值(因为 DB 命中较少),您的查询会更快,尤其是因为无法为关系创建索引。因此,如果您可以使用[:NEXT_WORD_1] 关系而不是[:NEXT_WORD {edgeLevel:1}] 关系,这将是最快的:

    MATCH p=(a:WORD { wholeWord:"are" })-[r:NEXT_WORD_1*..3]->(b:WORD { wholeWord: "you" })
    USING INDEX a:WORD(wholeWord)
    USING INDEX b:WORD(wholeWord)
    RETURN length(p);
    

    【讨论】:

    • 感谢您的回复。但是添加 USING INDEX b:WORD(wholeWord) 并没有加快查询速度。以前的查询成本:378082 总 db hits,您的第一个命题:planner:RULE。 10984317 总分贝命中。添加新关系 NEXT_WORD_1 是解决这种情况的方法,但我认为这是唯一的选择。我会尝试重新实现这个图形结构,我会在下一条评论中给你答案。
    • 我已经实现了新的关系类型,现在它的工作速度更快了。我对新型关系NEXT_WORD_1 planner 的查询:COST。在 188 毫秒内总共 61194 次 db 命中。您的第一个解决方案(使用两个索引和NEXT_WORD_1)规划器:RULE。 19993 总 db 在 172 毫秒内命中。
    猜你喜欢
    • 1970-01-01
    • 2019-09-13
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多