私はグラフを使用してサーバー側スタックの適切な部分を実装することを目的として、しばらくの間グラフをいじっています。私は Scala-Graph と Neo4J を使用しており、Spark GraphX を学習しています。私が実装したほとんどすべてのアプリケーションで、モデルはプロパティ グラフ (ノード -> エッジ -> ノード、属性付き) のモデルでした。
グラフ (正確には DAG) を設計するときに、2 つのノード間に強力で有向の関係を見つけた場合、1 つのノードから 1 つのノードへのエッジを設定します。これは明白で直感的です。Personが Site を気に入った場合、プロパティ「likes」を持つエッジがそれらを接続します。したがって:
[Nirmalya] -- (いいね) --> [StackOverFlow]
[ジョン] -- (いいね) --> [StackOverFlow]
[テッド] -- (いいね!) --> [GoogleGroups]
[Nirmalya] -- (いいね) --> [Neo4J]
現在、発信エッジを使用して、Nirmalyaが好きなサイトを簡単に見つけることができます。
しかし、 Nirmalya が好きなものを他に誰が好きか (John など)を知りたい場合は、Site 型 Node から Person 型 Node へのエッジも (プロパティ「isLikedBy」で) 作成する必要があると考えがちなので、パスが明確で、横断が直感的であること。このようなクエリに答えるために、どちらからでも他の人に到達できるように、すべての人とサイトは双方向で接続されている必要があります。
[Nirmalya] -- (Likes) --> [StackOverFlow] -- (IsLikedBy) --> [John]
しかし、専門家によって与えられた多くの例から、これは規定されていないことがわかります. 代わりに、これはincomingなどの演算子を使用することによって実現されます。つまり、2 つのノード間にエッジが設定されている場合、エッジの両方の方向を明示的に設定する必要はありません (「いいね」だけで十分で、「isLikedBy」は不要です)。隣接行列の実装により、おそらくこれが可能になりますが、DAG でその方向が明示されていない場合でも反対方向を導出できるため、少し混乱します。
私の質問は、私の理解のギャップはどこにありますか? 「IsLikedBy」方向が理想的に存在する必要がありますが、最適化していますか? あるいは、そのような双方向エッジが必要なユースケースがあり、それらを見つける必要があるということですか? 理論的根拠が完全に欠けていますか?
喜んで賢くなります。