Neo4j可变长度模式匹配调整

时间:2018-09-04 03:37:56

标签: neo4j

查询:

PROFILE
MATCH(node:Symptom) WHERE node.symptom =~ '.*adult male.*|.*151.*'
WITH node
MATCH (node)-[*1..2]-(result:Disease)
RETURN result

个人资料: enter image description here

问题: 数据库中有超过4万个“症状”节点,由于部分[[* 1..2]”,查询非常缓慢。

当长度为1时,即“ [* 1]”仅花费了4秒,而当长度为2时,即“ [* 1..2]”,则花费了约30秒。

有什么方法可以调整此查询吗?

1 个答案:

答案 0 :(得分:0)

首先,您的查询使用的是regex运算符,并且不能使用索引。您应该改为使用CONTAINS运算符:

MATCH (node:Symptom) 
WHERE node.symptom CONTAINS 'adult male' OR node.symptom CONTAINS '151'
RETURN node

您可以创建一个索引:CREATE INDEX ON :Symptom(symptom)

对于查询的第二部分,它没有任何关系...这是由于您要执行的复杂性。

因此,要获得更好的性能,您应该考虑:

  • 将关系类型放在模式上以减少返回的路径数:(node)-[*1..2:MY_REL_TYPE]-(result:Disease)
  • 将方向的关系放在模式上以减少返回的路径数:(node)-[*1..2:MY_REL_TYPE]->(result:Disease)
  • 找到另一种降低这种复杂性的方法(对关系的属性进行过滤,查看模型等)

作为参考,您可以直接在一个步骤中编写查询(即不使用WITH,但是在您的情况下,性能应该相同):

MATCH (node:Symptom)-[*1..2]-(result:Disease)
WHERE node.symptom CONTAINS 'adult male' OR node.symptom CONTAINS '151'
RETURN result