2017-01-24 4 views
0

キーワードを指定すると、キーワード、その参考文献、すべての論文の著者を含むすべての論文を検索したいと思います。私は3つのアプローチを使用して試しました。クエリの結果をユニークなリストに結合する - Neo4j

1つの結果をリストにまとめると、リスト(論文)に重複したエントリが表示されます。

MATCH (k:keyword)-[AREAOF]->(f:fieldOfStudy {fieldName: "fos1"}) 
WITH k 
MATCH (p:paper)-[:CONTAINS]->(k) 
WITH p 
MATCH (p)-[:REFERENCES]->(r:paper) 
WITH p,r 
MATCH (c:paper)-[:REFERENCES]->(p) 
WITH [c,p,r] as papers 
MATCH (a:author)-[:PUBLISHED]->(p:paper) 
WHERE p in papers 
return a,p 

アプローチ2 - +演算子 を使用して、私はthisに似た何かをしようとしたが、私は、型の不一致エラーが発生します。

MATCH (k:keyword)-[AREAOF]->(f:fieldOfStudy {fieldName: "fos1"}) 
WITH k 
MATCH (p:paper)-[:CONTAINS]->(k) 
WITH p 
MATCH (p)-[:REFERENCES]->(r:paper) 
WITH p,r 
MATCH (c:paper)-[:REFERENCES]->(p) 
RETURN p+r 

エラー:

Type mismatch: expected List<Node> but was Node (line 8, column 14 (offset: 229)) 
" return p+r" 
      ^

アプローチ3 - 各結果は、紙との間の接続を表す示すので、最初のアプローチが失敗したUNION

を使用。私はc - [:REFERENCES] - > p - [:REFERENCES] - > rです。 1次元の結果を得るために、私はUNIONを使用しようとしました。これは動作し、論文の一意のリストを取得しますが、出力を使用して著者の質問をすることはできません。

MATCH (k:keyword)-[AREAOF]->(f:fieldOfStudy {fieldName: "fos1"}) 
WITH k 
MATCH (p:paper)-[:CONTAINS]->(k) 
RETURN p as papers 
UNION 
MATCH (k:keyword)-[AREAOF]->(f:fieldOfStudy {fieldName: "fos1"}) 
WITH k 
MATCH (p:paper)-[:CONTAINS]->(k) 
WITH p 
MATCH (p)-[:REFERENCES]->(r:paper) 
RETURN r as papers 
UNION 
MATCH (k:keyword)-[AREAOF]->(f:fieldOfStudy {fieldName: "fos1"}) 
WITH k 
MATCH (p:paper)-[:CONTAINS]->(k) 
WITH p 
MATCH (c:paper)-[:REFERENCES]->(p) 
RETURN c as papers 

この場合、どのように最終回答(論文)を受け取り、著者を見つけることができますか?すなわち

(a:author)-[:PUBLISHED]->(p:paper) 
WHERE p in papers 
+0

'p + [r]'でアプローチ2を試してください –

+0

あなたはそうです、それはうまくいきます。しかし、アプローチ1と同様に、出力はpとrのペアを持つ2次元配列になります。出力をすべての論文の単一のリストにすることを希望します – ganninu93

答えて

1

0-1の可変関係を使用して論文からマッチングし、方向を省略することで、実際に必要なすべての論文を実際に得ることができます。ここで

はそれがうまくいくかもしれない方法は次のとおりです。

MATCH (k:keyword)-[:AREAOF]->(:fieldOfStudy {fieldName: "fos1"}) 
MATCH (p:paper)-[:CONTAINS]->(k) 
WITH p 
MATCH (p)-[:REFERENCES*0..1]-(paper:Paper) 
WITH DISTINCT paper 
MATCH (a:author)-[:PUBLISHED]->(paper) 
RETURN a, paper 

キーが無向である:REFERENCESが一致:

MATCH (p)-[:REFERENCES*0..1]-(paper:Paper) 

これが1に0を横断します:REFERENCESの関係を、 "紙" を意味含まれていますpにリンクされているノードだけでなく、どちらの方向にもREFERENCES関係でpにリンクされているノードがあるため、pを参照している論文と参照している論文を取得します。

0

あなたがリストに論文をcollectことができます。

MATCH ... 
WITH somePaper, collect(p) AS papers 
WHERE somePaper IN papers 
RETURN somePaper 
+0

私は収集を使用して所望の結果を得ることはできませんでしたが、もっと詳しく説明したいかもしれません。しかし、私が収集について調べているとき、私はUNWINDキーワードを発見しました。これは私が必要とするものでした。私はアンワインドアプローチの答えを掲載しました。助けてくれてありがとう、正しい方向に向ける – ganninu93

0

私はアプローチ1を使用し、いくつかのさらなる研究は、その後、1つのリストに答えを変換するためにUNWINDを使用した後。これには重複が含まれていたので、重複したエントリを除外するためにdistinct()を使用しました。結果は次のようになります。

関連する問題