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
任何人都可以告诉我应该怎样做才能像搜索结果一样快速地获得搜索结果。
答案 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 WITH
,ENDS WITH
和CONTAINS
。 STARTS WITH
将使用索引,因此此查询应该具有高性能:
MATCH (e:Entity)-[r]->(a:Addres)
WHERE a.addressLocation STARTS WITH "ABC XYZ"
RETURN r
ENDS WITH
和CONTAINS
(这正是你想要的)目前不使用索引,但在Neo4j 3.0中,它们都将使用索引。如果您想尝试,可以使用3.0版的里程碑版on the download page。