用节点(*)进行neo4j查询性能调优

时间:2013-06-21 19:47:40

标签: neo4j cypher

我添加了具有“nodetype”属性的节点,并且只想查询某种类型的节点。例如,我有一个“场所”节点类型,它是世界各地的场地列表。每个场地都有一个:IN_REGION,它将它连接到一个城市,然后有一个:IN_REGION一直到这个国家。所以:

venue-[:IN_REGION]->city-[:IN_REGION]->province-[:IN_REGION]->country

我正在对场地进行模糊搜索,并且需要搜索上面的任何一个并返回一个包含上述所有内容的字符串。我想在Neo4j上而不是在后端服务器上执行此操作。在这个上运行的理想查询是什么?我有以下内容:

START venue=node(*)
WHERE venue.nodetype! ='venue'
WITH venue
MATCH p = address<-[:HAS_ADDRESS]-venue-[r1:IN_REGION]->city-[r2?:IN_REGION]->prov-[r3?:IN_REGION]->country
with venue.name+','+address.streetAddress+','+city.name+','+prov.name+','+country.name as toSearch
WHERE toSearch=~ ".*QUERY_STRING.*"
return toSearch
LIMIT 30

其中QUERY_STRING是模糊搜索字符串。我主要想知道节点(*)并在最后进行查询 - 这是否会梳理每个节点?此外,一些关系是可选的并返回null - 我该如何处理?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

你基本上是在告诉它扫描整个数据库中的场地节点(一个很好的优化就是获得nodetype的索引或只是场地节点,并扫描它),然后遍历所有场地的地址/城市/等。 ,然后将这些地址与搜索字符串进行比较。你的限制不会对你的表现有多大帮助,除非你有一个非常小的数据库,否则它会发臭。你有几个场地?无论如何,你可能会考虑这样的事情:

start venue=node:venue_index('name:*QUERY_STRING*')
match address<-[:HAS_ADDRESS-venue-[:IN_REGION]->city-[?:IN_REGION]->prov-[?:IN_REGION]->country
return venue.name + ',' + address.streetAddress + ',' + city.name + ',' + coalesce(prov.name?, '') + ',' + coalesce(country.name?, '') as toSearch

start city=node:city_index('name:*QUERY_STRING*')
match address<-[:HAS_ADDRESS-venue-[:IN_REGION]->city-[?:IN_REGION]->prov-[?:IN_REGION]->country
return venue.name + ',' + address.streetAddress + ',' + city.name + ',' + coalesce(prov.name?, '') + ',' + coalesce(country.name?, '') as toSearch

类似的问题要解决,问题,国家。在2.0中,您可以将这些结果结合在一起。