web-dev-qa-db-ja.com

neo4j-ラベルvsプロパティvs関係+ノード

ラベルvsノードプロパティvsリレーションシップ+ノードを使用する場所に関する経験則。

例を挙げましょう。たとえば、店舗があり、neo4jに商品を入れたいとします。それらの識別子は製品のSKUであり、これも衣服、食品、電子機器用であるように分類したいと思います。ユーザーが何でも検索できるように、グラフを無料で検索し、その検索文字列に関連するすべてのものを返します。

使用する方が良いでしょうか:

  1. sku 001のノードがあり、それにFoodのラベルを付けます。
  2. sku 001のノードがあり、このノードにcategory:"Food"というプロパティがあります
  3. sku 001のノードがあり、Foodの別のノードを作成し、それらを関連付けるために「category」の関係を作成します。

プロパティを検索する場合は、ノードのプロパティを検索するよりもトラバースの方がはるかに高速であるため、リレーションシップ+ノードとして使用する方がよいことを読みました。

TIA

39
villager

カテゴリにプロパティ、ラベル、ノードのいずれを使用するかは、データのクエリ方法によって異なります。

(ここでは、かなり小さく、かなり固定されたカテゴリのセットがあると想定します。)

プロパティを使用カテゴリでクエリを実行せず、他の方法で見つかったノードのカテゴリを返す必要がある場合。 (例:sku 001のアイテムのカテゴリは何ですか?)

ラベルを使用カテゴリ別にクエリを実行する必要がある場合。 (例:10ドル未満のすべての食品は何ですか?)

ノードを使用カテゴリが何であるかを知らずにカテゴリをトラバースする必要がある場合。 (例:ユーザーが選択したものと同じカテゴリで最も人気のある10個のアイテムは何ですか?)

57
Ben Butler-Cole

このブログ投稿 ベンチマークが含まれているため、役立つ場合もあります。

「関係」を4つの異なる方法でモデル化しました…

  • 特定の関係タイプを使用する(node)-[:HAS_ADDRESS]->(address)
  • ジェネリックリレーションシップタイプを使用してから、エンドノードラベルでフィルタリングする(node)-[:HAS]->(address:Address)
  • ジェネリックリレーションシップタイプを使用してから、リレーションシッププロパティでフィルタリングする(node)-[:HAS {type:“address”}]->(address)
  • ジェネリックリレーションシップタイプを使用してから、エンドノードプロパティでフィルタリングする(node)-[:HAS]->(address {type: “address”})

<...>

要約すると…特定の関係#ftw!

10
Poliakoff