1

これに対する回答を検索しましたが、正確な解決策はありません。

私は、ある人のお気に入りのアイテムを追跡する簡単なアプリケーションを持っています。次のような関係を作成します。

         [:favorite]
(user) ---------------------> (item)
         timestamp:xxxxxx

ユーザー ノードはアイテムとのお気に入りの関係を取得し、タイムスタンプを関係プロパティとして保存します。

同じアイテムを複数のユーザーがお気に入りにすることも、1 人のユーザーが複数のアイテムをお気に入りにすることもできます。さて、私のユースケースは、次のような特定の日付範囲でお気に入りにされたアイテムを見つけることです:

(1) 過去 1 時間にお気に入りに追加されたアイテム

(2) 2015 年 1 月 1 日から 2015 年 1 月 15 日までにお気に入りに登録されたアイテム

(3) 2015 年 1 月 15 日にお気に入りに登録されたアイテムの時間別分割

これらの結果を返すための最も最適化された方法を見つけようとしています。PHPにはEveryman Neo4jを使用しています。

私の質問は、タイムスタンプ プロパティのインデックスを作成する方法です (パフォーマンスが大幅に向上すると思います)。

また、上記の 3 つのシナリオのクエリを構成する最適な方法は何ですか?

4

1 に答える 1

3

通常、グラフ内の一種のツリーまたはリンクされたリスト構造として時間をモデル化します。

ただし、ユースケースでは、relationship-auto-index を使用してタイムスタンプ プロパティのインデックスを作成し、クエリを実行できます。参照: http://neo4j.com/docs/stable/rest-api-configurable-auto-indexes .html

次のように、検索と並べ替えが簡単な形式を選択するのが理にかなっていると思いますyyyy-mm-dd-hh

次のように変更conf/neo4j.propertiesします。

relationship_auto_indexing=true
relationship_keys_indexable=timestamp

ただし、既存のデータを再インデックスする必要があります。

開始 rel=関係()

そして、あなたはそれを照会することができます:

start rel = relationship:relationship_auto_index("timestamp:2015-01-*")
match (user)-[rel]->(item)
....

また

start rel = relationship:relationship_auto_index("timestamp:2015-01-*")
return startNode(rel) as user, endNode(rel) as item

数値では範囲を指定できませんが、文字列では指定できません。

start rel = relationship:relationship_auto_index("timestamp:[2015-01-01-00 TO 2015-02-01-00]")
return startNode(rel) as user, endNode(rel) as item
于 2015-01-31T14:07:39.903 に答える