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



Entity和Addess节点之间存在关系。实体在eid上具有唯一键约束,地址在addressLocation上具有唯一密钥约束。我有数百万个实体和地址节点。精确的seach查询工作正常,下面是查询-

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

有人能告诉我该怎么做才能像准确的搜索结果一样快速地得到类似的搜索结果吗。

第一个查询使用索引查找(在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版本。

最新更新