0

Neo4j データベースの適切なインデックス戦略を決定するための助けが必要です。データベースにはアイテムを持つユーザーがいて、すべてのユーザーとアイテムには変更されたエポック整数値と UUID 値 (トリミングされた Base64 文字列) があります。私は 2.0-M6 で開発しているので、新しいスキーマベースのインデックス作成を適切に使用して、ラベル USER の「uuid」フィールドでユーザーにクエリを実行できます。

しかし、ユーザーのアイテムのインデックス作成はより複雑です。タイプ「userUUID = X AND modified > Y」の両方のクエリを実行したい。これは、数値 Y よりも大きい (最近の) 変更された整数を持つすべてのアイテムを返す必要があります。しかし、単純な検索も行いたいです。 「userUUID=X, itemUUID=Z」、単一のノードを返す必要があります。

  1. Lucene についての私の現在の非常に限られた理解では、おそらく最良の解決策は、「userUUID、itemUUID、変更された」3 つのキーを持つ 1 つのインデックスであり、複合クエリでクエリを実行できるようになります。しかし、そのようなインデックスをどのように正確に作成すればよいのでしょうか? また、ユーザー ベースが拡大しても高速であり続けるでしょうか? インデックスは主に userUUID プロパティで最適化する必要があります。これはすべてのクエリにあり、その後 itemUUID と変更された整数でのみ最適化されます。それは可能ですか?

  2. もう 1 つのオプションは、変更された値に対してユーザーごとに 1 つのインデックスを構築し、直接アイテムにアクセスするために結合キー "userUUID+itemUUID" を使用して 1 つのインデックスを構築することです。これは、Neo4j によって単一のキー インデックスが十分にサポートされ、文書化されているため、オプション 1 よりも実装がはるかに簡単です。しかし、100 万人のユーザーがいるとしたら、インデックス "modified-items-for-X" のインデックス ルックアップは依然として高速であり、それらすべてのインデックスがすべてのメモリを消費するのでしょうか?

この質問は関連していますが、Lucene indecies の数ははるかに少なくなっています。

編集。Stefan が推測したように、ユーザーとアイテムは OWNS 関係でリンクされており、UUID はデータベース内のすべてのノードで一意です。

さらに明確にするために、アイテムをクエリするための最もパフォーマンスの高いソリューションを探しています。1 人のユーザーが何千ものアイテムを持っていると予想され、「userUUID=X AND modified > Y」クエリがすべてのユーザーによって一定のペースで発行されます。 (1 分に 1 回でも)、「userUUID=X and itemUUID=Y」クエリと同様です。したがって、ここではすべてのミリ秒がカウントされます。

4

2 に答える 2

1

Neo4j 2.0 では、スキーマ インデックスは 1 つのプロパティに制限されていますが、ラベルごとに複数のインデックスを作成できます。ラベルUserを使用しItemていて、ユーザーがOWNSアイテムと関係があると仮定しています。さらに、uuid は本当に一意であり、複数のノードで共有されていないという前提があります。この場合、modifiedプロパティにインデックスを付けません。uuids にはただのインデックスがあります:

CREATE INDEX ON :User(userUuid)
CREATE INDEX ON :Item(itemUuid)

注意: トラバーサルの開始点を見つけるには、インデックスを使用する必要があります。

ユーザー X のすべてのアイテムを検索するには、以下をmodfied > y使用します。

MATCH (user:User)-[:OWNS]->(item:Item)
WHERE user.userUuid={X} and item.modified > {Y]
RETURN item

特定のアイテムを見つけるには、次のようにします。

MATCH (item:Item) 
WHERE item.itemUuid={uuid}
RETURN item

複合インデックスが本当に必要な場合は、従来のインデックス作成を使用できますが、スキーマ インデックスの方がはるかに快適です。

また、これを書いている時点で 2.0 はマイルストーン ビルドであり、本番環境に対応していないことにも注意してください。

于 2013-10-26T18:19:48.260 に答える
0

今後の参考のために、オプション 1 を使用することになり、項目の 3 つのキー インデックスを作成しました (Scala で):

val itemsIndex = neo4j.gds.index().forNodes("items")
itemsIndex.add(itemNode, "user", userUUID)
itemsIndex.add(itemNode, "item", itemNode.getProperty("uuid"))
itemsIndex.add(itemNode, "modified", new ValueContext(getProperty("modified").asInstanceOf[Long] ).indexNumeric())

次に、次のようにクエリします。

itemsIndex.query( "user:\"" + userUUID) + "\" AND item:\"" + itemUUID)+ "\"")
于 2013-11-14T09:17:47.777 に答える