2016-04-08 4 views
1

データベースにはホテル、ホテルのクチコミ、クチコミやトピックの用語(言葉)が含まれています(例:ホテルスタッフを説明する用語を含む「スタッフ」という話題があります)。すべてのノードのインデックスが存在します。次のような関係:< - レビュー - >用語 - >トピックneo4jのロングパスパターンの処理

現在、2つ以上の指定されたホテルへのパスを持つトピックを効率よく検索する方法を探しています。言い換えれば、私は2つのホテルの共通の話題に興味があります。ホテルAにトピック1,2,3へのパスがあり、ホテルBにトピック2,3,4へのパスがある場合、結果は2,3でなければなりません。

私は以下を試しましたが、非常に効率が悪く、ホテルとトピックの間のパスの可能性が非常に高いようです。基本的には、レビューの各単語が新しいパスを作成してチェックする必要があります。

// show all topics that two hotels have in common 
MATCH (h2:Hotel)<--(r2:Review)-->(t2:Term)-->(to:Topic)<--(t1:Term)<--(r1:Review)-->(h1:Hotel) 
WHERE h1.id IN ["id1","id2"] AND h2.id IN ["id1","id2"] AND NOT h1.id=h2.id 
RETURN h1.id,to.topic, count(to) AS topic_mentions 

私はこれに対処するためのより高速な方法があります場合、私はJavaや同様の言語でこれを実装した場合、私はおそらく各ホテルで始まり、その後、何のオーバーラップを取っBFSをやって試してみた疑問に思って私は見つける。私は、トランジェントエッジを直接エッジとして追加することはかなり確信しています - >トピックは、これをスピードアップしますが、私の限られたデータベース設計知識は、これは不必要に重複し、良い習慣ではないかもしれないと私に言った?

他のMATCHとWITH句と一致するパターンの前にidのマッチングを試みましたが、これは何もスピードアップしませんでした。私は問題が本当にパターンマッチングにあると思う。

答えて

1

私はKBの検索に似たようなものを作成しました。ホテルとトピックの間の直接的な関係により、この検索は簡単になり、より高速になります。例えば、一般的に複数のホテルを持つすべてのトピックの検索では、あなたが使用したい:これはすべてのトピックの数を返すことをこれら2つのホテルは、共通に持って、よく、または

MATCH (h1:Hotel)-[:TOPIC]->(t:Topic) 
MATCH (h2:Hotel)-[:TOPIC]->(t:Topic) 
WHERE h1 <> h2 
RETURN h1.id, h2.id, t.topic, count(t) AS topic_mentions 

注意をあなたが望むものではないかもしれません。

私が直接エッジ ホテルとして推移エッジを追加することをかなり確信している - トピックはこれをスピードアップするだろうが、私の限られたデータベース設計 知識が、これは 良い練習不必要に冗長ではないかもしれないと私に言いましたか?

暗黙の関係を明示的にすることは、グラフDBを非常に強力にするものの1つです。メンテナンスの面が懸念されています。つまり、誰かがレビューの言葉を更新した場合、(ホテル) - [:TOPIC] - >(トピック)関係が有効であることを確認する必要があります。とにかくあなたの元のデザインでそれをしなければならないので、そこに損失はありません。