2016-03-22 11 views
1

私たちはアプリの中にツリーのような構造を持つアイテムを持っています。ロールアップを使用したアクティビティフィード

(c:card)-[:child]->(subcard:card)-[:child]->(subsubcard:card) ... etc

操作は(任意のレベルで)カード上で実行されるたびに、我々はそれを記録したいと思います:あなたは、次のようなパターンを持っているかもしれません。ここではいくつかの可能なイベントは次のとおりです。

  • カードのタイトルは、ボブ
  • コメントはケイトがジョー
  • カードの状態を言及によって追加されたことにより、承認された
に保留から変更を更新しました

リンクリストのアプローチは普及しているようですが、実行したいクエリの種類を考えれば、それがベストであるかどうかはわかりません。

  • イベントの日時順の特定のカードと子カードに関連した活動のすべて、(基本的に我々はこれらのすべてを統合したいと思います。ここでは

    は、私たちが実行していることになる主なクエリがあります

    :活動は
  • 日時順の特定の人物に関連した活動のすべてをその上

我々は次のようにフィルタを追加したいのですが)一緒にフィード人によって

  • フィルターは、カードが非常に頻繁に再配置することができることに注意することも重要である期間

によって

  • フィルターを関与しました。言い換えれば、両親は変わるかもしれない。

    このようなモデルを作成するには、どのようにすればよいでしょうか?ありがとう!

  • 答えて

    0

    私はいくつかの提案がありますが、ベンチマークすることをお勧めします。

    Java APIを使用できる場合(おそらくNeo4jの管理されていない拡張機能を使用して)、リンクリストアプローチが有効な場合があります。リスト内の最新のイベントがカードに添付されているイベントであった場合(そして、イベントが発生した日までにリストが注文された場合)、時間をかけてフィルタリングしている場合は、指定された時刻より前のイベント。

    イベントをカードに直接添付すると、スーパーノード/密なノードで問題が発生する可能性があります。しかし、Cypherで照会するのが最も簡単です。問題は、Cypherがフィルタリングする前にすべてを調べることです。おそらくイベントの日時をイベント・ノードに配置し、それをノード((:Card)-[:HAS_EVENT]->(:Event)または(:Event)-[:PERFORMED_BY]->(:Person))との関係に置くことに加えて、照会のパフォーマンスを向上させることができます。クエリを実行すると、関係をフィルタリングして、ノードをトラバースする必要がなくなります。

    かかわらず、おそらく、そうのようなクエリを壊すために役立つだろう:

    MATCH (c:Card {uuid: 'id_here')-[:child*0..]->(child:Card) 
    WITH child 
    MATCH (child)-[:HAS_EVENT]->(event:Event) 
    

    私はMATCHは、それが評価する必要がありますパスの少ない順列を持っているとしていることを意味するものだと思い

    その他は、私は本当にちょうどそれらについて読む、個人的にスーパーノードを扱ったことがないよう、私の怪しげなアドバイスを補完するために歓迎され;。

    +0

    )のおかげで、ブライアン:)のNeo4jは範囲索引でソートできますか?たとえば、イベントノードのタイムスタンプがある場合、特定の時間範囲内に収まっていて、2.その子に属しているイベントを効率的にクエリできますか? –

    +0

    Neo4jは、範囲(2.3から始まる)でより高速なクエリを行うためにインデックスを使うことは間違いありません。トリックは、開始する場所が最も限定されているかどうかを確認できるようにしています。イベントの日付によるフィルタリングがより小さい出発点を与えると思われる場合は、イベントの代わりに「MATCH」を開始することができます。 –

    関連する問題