3

私が取り組んできた個人用 Web アプリケーションのデータベース バックエンドを見つけようとしています。私がデータに必要とする柔軟性のために、リレーショナル データベースは実行できず、何らかの形式のドキュメント ストレージが必要になる可能性があります。グラフデータベースについて知ったとき、これは完璧だろうと感じました。

しかし、私は問題のある人に出くわしました: 何らかの方法で 3 方向の関係を定義できるようにする必要があります。データベースはまだ決めていませんが、Neo4j をいじっているので、Cypher を使用して問題を説明します。

基本的に、私はこれから始めます:

(a:N)-[r:E]->(b:N)

私が必要としているのは、複数のノードを a と b だけでなく r にも関連付ける方法です。これらの他のノードは、3 つすべてに関するさまざまな情報を格納する予定です。これを処理するには、おそらく 2 つの方法しかないと判断しました。関係を独自のノードに格納するか、情報を含むノードへの参照を格納し、疑似エッジを作成します。 . 前者の方が、おそらく次のようなものを提供するより良いアイデアだと思います。

(a:N)<-[:E]-(r:R)->[:E](b:N)
(s:S)->(a)
(s)->(r)
(s)->(b)

したがって、これはデータのクエリに関する問題につながります。グラフ データベースを使用する最大のポイントは、グラフをトラバースできることです。このようなことをすると、タイプ N のノード間を再帰的にトラバースする方法はありますか? これを処理する適切な方法は何ですか?これを処理するいくつかの異なる方法を考えましたが、それらにはすべて欠点があります。このタイプの機能をネイティブにサポートする特定のグラフ データベースはありますか?

アップデート

元のコードでは、次のコードでノードを再帰的にトラバースできました。

MATCH (a:N)-[:E*]->(b:N)
RETURN a,b

ただし、エッジをハイパーエッジに引き抜くと、ノード タイプを交互に変更するため、グラフを再帰的に不定の深さまでトラバースできる方法があるかどうかわかりません。私はラインに沿って何かを探しています

MATCH chain=((a:N)-[]->(r:R)-[]->(b:N))*
RETURN [nodes of type N along the chain]

答えが、ハイパー エッジの作成中に a と b の間にエッジも作成することだけである場合、私の質問は次のようになります。エッジとハイパー エッジが一緒に削除されるようにする良い方法はありますか? 基本的に、両方を持つことは、実際の解決策ではなく、回避策のように感じます.

4

3 に答える 3

6

あなたが説明するシナリオは、言及された@Pangeaのハイパーエッジパターンによってプロパティグラフモデルで処理されます。基本的に、エッジ (エッジの内外が必要) を頂点に変換します。グラフについては、非正規化ではなく、別のモデリングの抽象化と考えることができます。

エッジ上のエッジのネイティブ サポートに関する限り、質問にタグを付けたグラフのいずれも、そのような機能を直接サポートしていません。Titan と OrientDB を含めたので、TinkerPop もソリューションの一部として評価していると思います。さらに、ブループリントはエッジ オン エッジをサポートしていないため、ブループリント グラフもサポートしていないと言えます。

トラバーサルに関する限り、「再帰的にトラバースする」という意味に完全に従っているとは言えません。少し詳しく説明していただければ、回答を修正することができます。「a」頂点からトラバースして、Gremlin の他のすべての関連頂点を見つける方法の簡単な例を追加します (申し訳ありませんが、Cypher はわかりません)。

gremlin> g = new TinkerGraph()
==>tinkergraph[vertices:0 edges:0]
gremlin> va = g.addVertex([type:'N',name:'a'])
==>v[0]
gremlin> er = g.addVertex([type:'R',name:'r'])
==>v[1]
gremlin> vb = g.addVertex([type:'N',name:'b'])
==>v[2]
gremlin> vc = g.addVertex([type:'N',name:'c'])
==>v[5]
gremlin> va.addEdge('e',er)
==>e[3][0-e->1]
gremlin> vb.addEdge('e',er)
==>e[4][2-e->1]
gremlin> vc.addEdge('e',er)                   
==>e[6][5-e->1]
gremlin> va.out.in.except([va]).name
==>c
==>b
gremlin> vd = g.addVertex([type:'N',name:'d'])
==>v[7]
gremlin> es = g.addVertex([type:'R',name:'s'])
==>v[8]
gremlin> vb.addEdge('e',es)
==>e[9][2-e->8]
gremlin> vd.addEdge('e',es)
==>e[10][7-e->8]
gremlin> x=[];va.aggregate(x).out.in.except(x).loop(4){it.loops<2}.name
==>c
==>b
gremlin> x=[];va.aggregate(x).out.in.except(x).loop(4){it.loops<3}.name
==>d

に関してで:

答えが、ハイパー エッジの作成中に a と b の間にエッジも作成することである場合、私の質問は次のようになります。エッジとハイパー エッジが一緒に削除されるようにする良い方法はありますか?

「ハイパーエッジ」頂点を削除すると、それに接続されているエッジが自動的に削除されるため、効果的にまとめて削除されます。

于 2013-12-28T13:17:22.477 に答える
0

Neo4j のドキュメントのHyperedgesパターンを見てください。

于 2013-12-28T02:43:36.837 に答える