ラベルvsノードプロパティvsリレーションシップ+ノードを使用する場所に関する経験則。
例を挙げましょう。たとえば、店舗があり、neo4jに商品を入れたいとします。それらの識別子は製品のSKUであり、これも衣服、食品、電子機器用であるように分類したいと思います。ユーザーが何でも検索できるように、グラフを無料で検索し、その検索文字列に関連するすべてのものを返します。
使用する方が良いでしょうか:
sku 001
のノードがあり、それにFood
のラベルを付けます。sku 001
のノードがあり、このノードにcategory:"Food"
というプロパティがありますsku 001
のノードがあり、Food
の別のノードを作成し、それらを関連付けるために「category
」の関係を作成します。プロパティを検索する場合は、ノードのプロパティを検索するよりもトラバースの方がはるかに高速であるため、リレーションシップ+ノードとして使用する方がよいことを読みました。
TIA
カテゴリにプロパティ、ラベル、ノードのいずれを使用するかは、データのクエリ方法によって異なります。
(ここでは、かなり小さく、かなり固定されたカテゴリのセットがあると想定します。)
プロパティを使用カテゴリでクエリを実行せず、他の方法で見つかったノードのカテゴリを返す必要がある場合。 (例:sku 001
のアイテムのカテゴリは何ですか?)
ラベルを使用カテゴリ別にクエリを実行する必要がある場合。 (例:10ドル未満のすべての食品は何ですか?)
ノードを使用カテゴリが何であるかを知らずにカテゴリをトラバースする必要がある場合。 (例:ユーザーが選択したものと同じカテゴリで最も人気のある10個のアイテムは何ですか?)
このブログ投稿 ベンチマークが含まれているため、役立つ場合もあります。
「関係」を4つの異なる方法でモデル化しました…
- 特定の関係タイプを使用する
(node)-[:HAS_ADDRESS]->(address)
- ジェネリックリレーションシップタイプを使用してから、エンドノードラベルでフィルタリングする
(node)-[:HAS]->(address:Address)
- ジェネリックリレーションシップタイプを使用してから、リレーションシッププロパティでフィルタリングする
(node)-[:HAS {type:“address”}]->(address)
- ジェネリックリレーションシップタイプを使用してから、エンドノードプロパティでフィルタリングする
(node)-[:HAS]->(address {type: “address”})
<...>
要約すると…特定の関係#ftw!