2017-05-02 11 views
0

私はneo4jを初めて使用しており、db設計哲学に関する助けに感謝します。Neo4jデータベース - リンクまたはプロパティ?

私は私のデシベルの動物の1,000sを持っており、それぞれが約10種(ウシ、ヒツジ、ヤギ、ネコ、イヌ.....)の一つである

リレーショナルDBに私が持っているでしょう動物表と種表とを含み、各動物の種は、動物IDと種IDとの間の結合によって定義される。

neo4jでは、動物をその性質の1つとしてノードと種として持つことが「明白な」アプローチです。しかし、これは、綴りの違いなどのリスクを伴う種名の1000個のコピーを維持するという古典的な問題に直面しているからです。

: - [のis_a] - (デイジー:動物)>のis_a関係を有する種(ウシ:ウシ)

こと恐ろしく不器用な '感じ'。ほぼすべての検索は、特定の動物/種の組み合わせになります。

「好ましい」ソリューションとは何ですか?

似たような決定があります。すべての動物は「生きている」または「死んでいる」のいずれかです。私はそれを財産にするのですか?あるいは、生きて死んだと呼ばれる2つのノードの1つに動物を向けるのですか?動物として扱うあなたは、いくつかの種を越えてクエリを実行する必要がある場合は

(daisy:Cow{name:'daisy'}), (daffy:Duck{name:'daffy'}) 

、:

あなたはその種の動物としてあなたのラベルとして種を使用して、ノード試みることができる任意のポインタ

答えて

0

をありがとうたとえば、Cow、:Duckなどのノードには、ラベルを付けることもできます。

ここでの欠点は、ノードラベルが検索で動的になることができないことです(少なくとも、このような索引検索を利用することはできません)。

ので

ユーザーがパラメータ name:'daisy'species:cow、最速のルックアップを入力することができれば :Animal(name)にインデックスを持っており、このインデックスにあなたの試合を行い、その後にフィルタリングするだろう(あなたはダイナミックラベルを扱っているので)種:

MATCH (animal:Animal) 
WHERE animal.name = $name 
AND $species in labels(animal) 
RETURN animal 

それは多くの異なるフィールドとして種を有する以上ではありません。スペルミスがはるかに容易でなければなりませんので、可視性を持っている方がはるかに簡単だ除いて、動物のノードとあなたのグラフのラベルに報告(call db.labels)スポットと正しい両方。

一般的に、ルックアップがtype + some property valueである場合は、そのタイプをノードラベルとしてモデル化し、高速検索のためにその組み合わせにインデックスを作成するのが良いケースです。

ブール状態については、すべてのオプションを使用できます(ノードラベル、LifeStateノード:Animalノード、boolean isAliveまたはisDeadプロパティ)。私は個人的にここでブール値のプロパティを好むだろう。

関連する問題