就像对索引属性的搜索一样,在Neo4j的密码查询中花费更多时间

时间:2016-03-29 11:17:30

标签: neo4j cypher

Entity和Addess节点之间存在关系。实体对eid具有唯一的键约束,并且Address对addressLocation具有唯一的键约束。 我有数百万个实体和地址节点。精确的搜索查询工作正常,这是查询 -

match(e:Entity)-[r]->(a:Address) where a.addressLocation="ABC XYZ" return r

但是像搜索查询花费太多时间导致ReadTimeOutException。这是查询 -

match(e:Entity)-[r]->(a:Address) where a.addressLocation=~".*(?i)ABC XYZ.*" return r

任何人都可以告诉我应该怎样做才能像搜索结果一样快速地获得搜索结果。

1 个答案:

答案 0 :(得分:1)

第一个查询使用索引查找(在Address.addressLocation上):

match(e:Entity)-[r]->(a:Address) where a.addressLocation="ABC XYZ" return r

第二个查询使用的是一个无法使用索引的正则表达式,因此性能不高:

match(e:Entity)-[r]->(a:Address) where a.addressLocation=~".*(?i)ABC XYZ.*" return r

Cypher有三个字符串比较运算符STARTS WITHENDS WITHCONTAINSSTARTS WITH将使用索引,因此此查询应该具有高性能:

MATCH (e:Entity)-[r]->(a:Addres)
WHERE a.addressLocation STARTS WITH "ABC XYZ"
RETURN r

ENDS WITHCONTAINS(这正是你想要的)目前不使用索引,但在Neo4j 3.0中,它们都将使用索引。如果您想尝试,可以使用3.0版的里程碑版on the download page