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

基本的には、会場ノードの DB 全体をスキャンするように指示し (適切な最適化は、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 では、これらの結果を結合できます。

于 2013-06-21T22:23:58.090 に答える