0

基本的に、私はエンティティの有向グラフを CouchDB に保存しており、グラフのインとアウトに向かうエッジを見つけることができる必要があります。

設定:

現在データが保存されている方法は次のとおりです。各ドキュメントは、2 つのエンティティ間の RELATION を表します。

doc: {
    entity1: { name: '' ... },
    entity2: { name: '' ... }
    ...
}

一連の発行を行うビューがあり、そのうちの 2 つはエンティティ 1 コンポーネントとエンティティ 2 コンポーネントをキーとするドキュメントを発行するので、次のようになります。

function() {
    emit(['entity1', doc.entity1.name]);
    emit(['entity2', doc.entity2.name]);
}

エッジは有向であり、エンティティ 1 とエンティティ 2 から移動します。したがって、エンティティの外に出ているエッジを見つけたい場合は、最初のエミットをクエリするだけです。エッジをエンティティに入れたい場合は、2 番目のエミットにクエリを実行します。

問題:

ここでの問題は、エンティティの INTOOUT OF の両方に向かうエッジをキャプチャする必要があるという事実にあります。これら 2 つの放出を [x] UNIQUE ペアの単一の双方向セットにグループ化または削減する方法はありますか?

この行動を促進するために私の意見を整理するより良い方法はありますか?

4

1 に答える 1

1

2 番目のビューを作成する方が望ましい場合があります。しかし、次のように、あらゆる種類の異なるデータを同じビューに詰め込むことを妨げるものは何もありません。

function() {
    if (doc.entity1.name == doc.entity2.name) {
      emit(['self-ref', doc.entity1.name], 1);
    }
    emit(['both'   [doc.entity1.name, doc.entity2.name]], 1);
    emit(['either' [doc.entity1.name, "out"]], 1);
    emit(['either' [doc.entity2.name, "in"]], 1);
    emit(['out', doc.entity1.name], 1);
    emit(['in', doc.entity2.name], 1);
}

次に、次のことを簡単に行うことができます。

  • すべての自己参照を見つけます:
    • startkey=["self-ref"]&endkey=["self-ref", {}].
  • 特定のノードのすべてのエッジ (着信または発信) を検索します。
    • startkey=["either", [nodeName]]&endkey=["either", [nodeName, {}]]
    • これを減らさないと、キーの "in" と "out" が保持されます。着信エッジまたは発信エッジを持つすべてのノードをクエリする必要がない場合は、最後の 2 つのエミッターを「どちらかの」エミッターに置き換えることができます。
  • node1 -> node2 からすべてのエッジを検索します。
    • key=["both", [node1, node2]

特定のノードの着信または発信の元のクエリと同様に。

この結合されたビュー アプローチまたはマルチビュー アプローチのどちらかを選択する前に、アプリケーションの一般的なユース ケースのベンチマークを行うことをお勧めします。

于 2012-08-09T18:56:40.307 に答える