非常沉重的密码MATCH查询

时间:2016-03-06 18:40:55

标签: neo4j cypher

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

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

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

Cypher PROFILE query

1 个答案:

答案 0 :(得分: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);