私が取り組んできた個人用 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 の間にエッジも作成することだけである場合、私の質問は次のようになります。エッジとハイパー エッジが一緒に削除されるようにする良い方法はありますか? 基本的に、両方を持つことは、実際の解決策ではなく、回避策のように感じます.