2017-08-09 6 views
1

これは設計上の問題であり、パフォーマンスとメンテナンスに関する注意事項が必要です。ラベルとリレーションシップによるNeo4Jデータモデルの設計

ラベルは他のノード/ラベルとの関係を示すことをお勧めしますか?

Approach-1: 
create (n:Actor:Director {name:'Clint Eastwood'}) 
create (n:Movie {name:'Gran Torino'}) 

MATCH (a:Actor {name:'Clint Eastwood'}), (m:Movie {name:'Gran Torino'}) 
CREATE (a)-[:ACTED_IN]->(m) 

この場合、Actor/Directorは実際には人物と映画ノードの関係です。その人物が映画の俳優と監督の両方であれば、映画ノードとの2つの関係を持つPersonノードとして作成する必要がありますか?

Approach-2: 
create (n:Person {name:'Clint Eastwood'}) 
create (n:Movie {name:'Gran Torino'}) 

MATCH (p:Person {name:'Clint Eastwood'}), (m:Movie {name:'Gran Torino'}) 
CREATE (p)-[:ACTOR]->(m) 

MATCH (p:Person {name:'Clint Eastwood'}), (m:Movie {name:'Gran Torino'}) 
CREATE (p)-[:DIRECTOR]->(m) 

アプローチ-2は、より良いエンジニアリング賢明なようだ、しかしのNeo4jの例のドキュメントでは、(参照:https://neo4j.com/developer/kb/how-do-i-report-on-nodes-with-multiple-labels/)-1に接近するようにreferes

をだから、どちらが長期的には、クリーナーより良い、そしてより効率的です?

答えて

1

一般に、ラベルはノードをグループ化するために使用され、グラフ全体でノードがどの役割を表すかを示します。あなたが指すの例では、クリント・イーストウッドが俳優・グループの一部と取締役group.Thisの一部であることを示している

彼は彼の作品のすべての映画の中で役割「俳優」「ディレクター」を果たしていることを意味するものではありません。この例では、クリント・イーストウッドが「グラン・トリノ」を演出し監督しています。しかし、あなたがクリント・イーストウッドと彼が唯一行動した映画との関係を必要とするなら、あなたは何をするでしょうか?

クリーナー、より良い、より効率的なアプローチは、あなたのドメインと何をしているかによって異なります。たぶん両方の組み合わせが良いイデアです。

俳優や監督を探してデータベースを照会する必要がある場合は、ラベル:Actor:Directorを使用してこれらのノードをグループ化することをお勧めします。そうでない場合は、これらのラベルは必要ありません。また、関係を使用して:Person:Movieの間の関係の意味を示すことをお勧めします。つまり、()-[:ACTED_IN]->()()-[:DIRECTED]->()のような関係です。

関連する問題