2016-07-16 10 views
0

私はそれぞれ独自のプロパティセットを持つ複数のタイプのノード(ラベル)を持つneo4jインスタンスを持っています。 ( "名前"、 "住所"、 "父親の名前")
"場所"プロパティ( "名前"、 "国"、 "市")を持つラベル "人物"その上
ラベルのプロパティを持つ「イベント」(「名前」、「市」、「カントリー」)
と...Neo4J:すべてのノードとすべてのプロパティを検索するCypher

今、一つの方法は、私が知っているとき、「XYZ」のようなクエリを検索することです仕様:

セイ:マッチ(N:人)n.Name = "XYZ" retuen N

私の質問は、ブラインド検索を行うことができる単一の「効率的な」サイファークエリですか?基本的には、すべてのラベルとすべてのプロパティを検索し、一致するノードを私に与えることができるはずです。だから私のDB内の人物、場所、イベント、および他のラベルのすべてのプロパティと 'xyz'を一致させる単一のクエリ。

非常に長いwhere節を使用している可能性があることを理解しています。私はすべてのラベルとそれぞれのプロパティをハードコードしていますが、私はそれを探していません。これを行うには、先の明日のneo4j Cypherはありますか?

おかげ Abhi

答えて

1

もちろんO(n)のものを入力され、完全なグラフのスキャンを行うことができます。

match (n) 
with n, [x in keys(n) WHERE n[x]='xyz'] as doesMatch 
where size(doesMatch) > 0 
return n 

別 - よりパフォーマンスだけでなく、道、より複雑な - アプローチが実装されるだろうしTransactionEventHandlerすべてのプロパティをレガシーインデックスに入れて、そのプロパティをクエリします。

+0

こんにちはステファン、ありがとう。クエリは機能しますが、あなたの言われたように非常に遅いです。現在、私のグラフはわずか数百万のノードであり、クエリには時間がかかります。私はこれがスケーラブルではないことを理解しています。 Neo4jとSolr/Luceneを統合することは選択肢かもしれないと思いますか?そのようなシナリオを処理するためにより最適化されていると信じているので、すべてのユニバーサル検索はLuceneに向けられますか? – user1826116

+0

私たちは同じ問題を抱えており、Apache Solrを使って克服することができました。パフォーマンスはかなり良いですが、私たちが直面した唯一の欠点であるdbへの変更を行うたびに、neo4jと同期する必要があります。 –

1

関係が関係しているときや、特定のラベルやプロパティで検索されたノードを拘束できるときは、neo4jは好きですが、あなたの検索の種類はneo4jのものではありません。この種の包括的な検索には、データベースはほとんどありません。

neo4jの上にElasticSearchレイヤーを追加することをお勧めします。これは、データベース内のあらゆる種類の豊富な検索ツールです。

+0

ありがとうございます。私のElasticSearchについての知識は限られていますが、概念的にはLuceneに似ています。また、私はデフォルトでneo4jがLuceneインデックスを使うと思います。 ElasticSearch(https://neo4j.com/developer/elastic-search/)の統合が従来のluceneインデックス作成よりも優れていることを理解したかっただけです。それとも、私の前提に完全に間違っていますか? – user1826116

+0

私の理解では、ESはすべての文書のすべてのフィールドに逆索引を使用しています。これは、あなたのケースのような盲検の検索には完璧です。 Neo4jはLuceneを使用していますが、索引付けはすべてのノードでフルテキストではありません。 :ラベル(プロパティ)の組み合わせでスキーマインデックス(または一意の制約)が作成される場合にのみ、メリットが得られます。 neo4jがすべての視覚障害をサポートするためには、新しいプロパティやラベルを手作業で保守することで、すべてのラベル/プロパティの組み合わせにインデックスを作成する必要があります。これらの広範な検索要件については、上部にESレイヤーを使用してください。 – InverseFalcon

+0

明らかに、neo4jのレガシーインデックスは、全文検索のフルテキスト検索用に設定されている可能性があります。このためにマニュアルをチェックし、インデックスを明示的に使用する必要があるかどうかを確認することもできます。可能な限り、スキーマの索引はフードの下で使用されていますが、手動でレガシー索引を使用する必要があります。 – InverseFalcon

関連する問題