2017-01-04 5 views
2

間の共通のノードを検索し、私は、次のノードを持つhereのNeo4jサイファー:記事と言葉:質問への非常に類似したマッチしたノードの集合

を掲載。各単語はMENTIONED関係によって記事に接続されています。

一般的な単語のリストが動的である一般的な単語を持つすべての記事をクエリする必要があります。クライアントの観点から言えば、私は単語のリストを戻し、共通の言葉を持つ記事の結果を期待しています。

次のクエリでは、ジョブ

WITH ["orange", "apple"] as words 
MATCH (w:Word)<-[:MENTIONED]-(a:Article)-[:MENTIONED]->(w2:Word) 
WHERE w.name IN words AND w2.name IN words 
RETURN a, w, w2 

を行いますが、1つの単語リストでは動作しません。どんな数の単語を扱うにはどうすればいいですか?これを行うより良い方法はありますか?

答えて

3

はい。それらの単語のサブセットが含まれているすべての記事を検索し、その後に述べた言葉の数は、あなたのワードリストで供給された単語の数ある記事だけを返す

  1. :私は考えることができる2つの方法があります。

  2. 取得方法:指定された単語リストの単語ノードを取得してから、記事にすべての単語が記載されている記事を取得します。ここで

が上でこれをテストするためのグラフ例です:記事で触れた単語の数にワードリストのサイズを比較

MERGE (a1:Article {name:'a1'}), 
     (a2:Article {name:'a2'}), 
     (a3:Article {name:'a3'}) 
MERGE (w1:Word{name:'orange'}), 
     (w2:Word{name:'apple'}), 
     (w3:Word{name:'pineapple'}), 
     (w4:Word{name:'banana'}) 
MERGE (a1)-[:MENTIONED]->(w1), 
     (a1)-[:MENTIONED]->(w2), 
     (a1)-[:MENTIONED]->(w3), 
     (a1)-[:MENTIONED]->(w4), 
     (a2)-[:MENTIONED]->(w1), 
     (a2)-[:MENTIONED]->(w4), 
     (a3)-[:MENTIONED]->(w1), 
     (a3)-[:MENTIONED]->(w2), 
     (a3)-[:MENTIONED]->(w3) 

アプローチ1は、次のようになります。

WITH ["orange", "apple"] as words 
MATCH (word:Word)<-[:MENTIONED]-(article:Article) 
WHERE word.name IN words 
WITH words, article, COUNT(word) as wordCount 
WHERE wordCount = SIZE(words) 
RETURN article 

これは、記事と言及された単語との間に、言葉が何回言及されているかに関わらず、言及された関係が1つしかない場合にのみ機能します。

WITH ["orange", "apple"] as words 
MATCH (word:Word) 
WHERE word.name in words 
WITH COLLECT(word) as words 
MATCH (article:Article) 
WHERE ALL (word in words WHERE (word)<-[:MENTIONED]-(article)) 
RETURN article 

あなたが把握するには、これらのそれぞれにPROFILEを使用して試すことができます:我々はすべての単語が記載されている記事に一致していることを確認するための言葉:

アプローチ2はのコレクションにALLを()を使用していますあなたのデータセットに最も適しています。

+0

ありがとう@InverseFalcon!これは素晴らしいです。 – purplecones

関連する問題