查询:
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秒。
有什么方法可以调整此查询吗?
答案 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