2017-06-13 10 views
0

私はNeo4jの初心者です。サンプルで提供されているデータベースで作業しています(Link)。 同じ映画内で動作している各アクターとの間で新しい相対関係を作成しようとしています。私はNeo4j Cypherがクエリを実行していません

MATCH (p1:Actor)-[:ACTS_IN]->(:Movie)<-[:ACTS_IN]-(p2:Actor) WHERE id(p1)>id(p2) MERGE (p1)-[:ACTED_WITH]->(p2)

このクエリを実行しかし、未知の理由のために、それはいくつかの関係ではなく、他人が作成されます。私は、ノードタイプと関係タイプの両方をチェックするが、それらはすべて同じであると思われましたので、クエリはすべての場合に正しく実行されるはずです

RYこの事はちょうど、リンクからDBをダウンロードする上記のクエリを実行し、この2つの作品をチェックし、アバターの作品ではなく、このクエリはあなたが必要なものを行う必要がありますハートの戦争

MATCH p=(a)-[]-() WHERE a.title = "Hart's War" OR a.title="Avatar" RETURN p

+0

残念ながらそのDBはのNeo4jのそれ以降のバージョンで動作するように更新されていない、私はそれはあなたが見ている行動を説明するのかはわからないが、あなたは、データを移行する必要があるだろう、しかしながら。 ':play movies'を使って組み込みムービーデータベースを使ってみましたか? – InverseFalcon

+0

@InverseFalcon neo4jの設定ファイルに 'dbms.allow_format_migration = true'を追加するだけで、彼はあなたのためのフォーマットを移行します! – user3351109

+0

あなたがリンクしたデータベースを試してみても、クエリーは正常に機能し、すべてのコアクターは正しく接続されているようです。 Neo4jのどのバージョンを使用していますか?グラフの結果に自動完成しましたか? – InverseFalcon

答えて

0

をして働いていない:

MATCH (p1:Actor)-[:ACTS_IN]->(m:Movie) 
MATCH (p2:Actor)-[:ACTS_IN]->(m) 
WHERE p2 <> p1 
OPTIONAL MATCH (p1)-[r:ACTED_WITH]-(p2) 
FOREACH (n IN (CASE WHEN r IS NULL THEN [0] ELSE [] END) | 
    MERGE (p1)-[:ACTED_WITH]->(p2) 
) 

この方法がこれを行うのが最善かどうかわかりませんが、これはうまくいくと思います。

関係を2つのノード間で1回だけ作成します((a)-[:ACTED_WHT]->(b)(a)<-[:ACTED_WHT]-(b)ではなく)this trickを使用しています。基本的にはIFの条件をFOREACHCASEというステートメントを使ってシミュレートしています。

Neo4j 3.2でテスト済みです。

Output

+0

私はクエリと同じ結果を実行しようとしましたが、リバースリンク( '(a) - [:ACTED_WHT] - >(b)と私の問題は、それがすべてのグラフに沿って作られているのではなく、その部分集合の上に作成されているということです。 – user3351109

+0

奇妙です。 Neo4j 3.2とMovie Database Datasetでここで働いた。私はプリントスクリーンで自分の答えを更新しました。リレーションシップのタイプとラベルを変更しました。 –

+0

データセットをもう一度ダウンロードし、クエリのみを実行しました。私がClint EastwoodとRichard Harrisと一緒に見つけた唯一の映画は "Unforgiven"であり、これは自分のコンピュータ上でどのように表示されるかのスクリーンショットです。 http://imgur.com/a/6U0ht – user3351109

関連する問題