29

最近は、Neo4j のようなグラフ データベースと、Prolog と miniKanren のロジック プログラミングについて調べています。私がこれまでに学んだことから、どちらも事実とそれらの間の関係を指定することができ、結果のシステムにいくつかの選択を照会することもできます。したがって、実際には、どちらもグラフの作成とクエリに使用できますが、異なる構文を使用するという点で、それらの間に大きな違いはありません。ただし、それらはまったく異なる種類のソフトウェアとして提示されます。

データベースがより時空間的に効果的なストレージ技術を提案する可能性があるという技術的なことと、miniKanren のような小さなロジック コアがよりシンプルで埋め込み可能であることを除いて、グラフ データベースとロジック プログラミング言語の実際の違いは何ですか。 + クエリ API?

4

3 に答える 3

27

いいえ、それらとneo4jによって具現化された論理プログラミングはまったく異なります。

あるレベルでは、それらが概念的にグラフ ストレージとグラフ クエリの両方に相当することは正しいです。しかし、論理プログラミングの場合、それは概念的にはグラフ クエリにすぎず、実際にそのように格納されているという保証はありません (neo4j の場合はそうです)。

第 2 に、ロジック プログラミングでは、通常、多くのデータから推論できるホーン句を確立しようとします。角節は、「ある人が男性であり、生物学的な子供の直接の祖先である場合、それはその人が父親であることを意味する」のような単純なルールと考えることができます。neo4j を使用した cypher では、一致させたいグラフ パターンを記述します。これにより、データが得られます。たとえば、次のようになります。

 MATCH (p:Person)-[:father*]->(maleAncestor:Person)
 RETURN maleAncestor

これは、関係によってグラフをトラバースし、father男性の祖先を返すように指示します。論理プログラミング言語では、このようにはしません。aの父であるbことaは、男性でありa、 の祖先であることを意味する場合がありますb。これは、すべての有効な a/b ペアリングについて暗黙的かつ推移的に述べます。それから、「男性の祖先は誰ですか?」と質問します。プログラミング環境は、ルールを利用してそれに答えます。これは、上で指定した暗号と非常によく似たデータを介してトラバーサルを構築する効果がありますが、データを理解し、そのトラバーサルを構築する方法はまったく異なります。

ロジック プログラミング言語は通常、述語の解決を通じて機能します。cypher のようなグラフ クエリ言語は、パターン マッチングと明示的なパス指定の組み合わせによって機能します。彼らは非常に異なっています。

于 2015-03-22T13:42:08.363 に答える