0

我添加了具有“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 - 我该如何处理?

任何帮助是极大的赞赏!

4

1 回答 1

1

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

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 中,您可以将这些结果合并在一起。

于 2013-06-21T22:23:58.090 回答