Vor kurzem habe ich in Graph-Datenbanken wie Neo4j und in Logik-Programmierung in Prolog und MiniKanren gesucht. Von dem, was ich bisher gelernt habe, erlauben beide, Fakten und Beziehungen zwischen ihnen zu spezifizieren, und auch das resultierende System für einige Auswahlen abzufragen. So kann ich eigentlich keinen großen Unterschied zwischen ihnen sehen, da beide verwendet werden können, um einen Graphen zu erstellen und ihn abzufragen, aber mit unterschiedlicher Syntax. Sie werden jedoch als völlig unterschiedliche Arten von Software präsentiert.
Abgesehen von der technischen Tatsache, dass Datenbanken eine raumzeitlich effektivere Speichertechnologie vorschlagen, und abgesehen davon, dass kleine logische Kerne wie miniKanren einfacher und einbettbar sind, was ist der tatsächliche Unterschied zwischen Graph-Datenbanken und logischen Programmiersprachen, wenn sie beide einfach sind eine Graphdatenbank + Abfrage-API?
Nein, die Logikprogrammierung, wie sie von diesen Dingen und neo4j verkörpert wird, ist ganz anders.
Auf einer Ebene haben Sie recht, dass sie konzeptionell sowohl für den Graphspeicher als auch für die Graphabfrage stehen. Aber für die Logik-Programmierung ist es nur konzeptionell Graph-Abfrage, es gibt keine Garantie, dass es tatsächlich so gespeichert wird (wo mit neo4j ist es).
Zweitens versuchen Sie bei der Logikprogrammierung in der Regel Hornklauseln zu erstellen, mit denen Sie viele Daten durchdenken können . Sie können sich eine Hornklausel als eine einfache Regel vorstellen, wie "Wenn eine Person männlich ist und der direkte Vorfahre eines biologischen Kindes ist, bedeutet das, dass diese Person ein Vater ist". In der Chiffre mit neo4j würden Sie ein Graphenmuster beschreiben, das Sie abgleichen möchten, das Daten ergibt, z. B.:
%Vor% Dies sagt an, dass das Diagramm nach father
Beziehungen durchlaufen und männliche Vorfahren zurückgegeben werden sollen. In einer Logik-Programmiersprache würden Sie es nicht so machen. Sie können angeben, dass a
ein Vater von b
ist, dass a
männlich ist und a
ein Vorfahre von b
ist. Dies würde implizit und transitiv für alle gültigen a / b-Paarungen angeben. Dann würden Sie eine Frage stellen: "Wer sind die männlichen Vorfahren?" Die Programmierumgebung würde das dann unter Ausnutzung Ihrer Regeln beantworten. Das würde den Effekt haben, eine Durchquerung durch die Daten zu erzeugen, die der oben angegebenen Chiffre sehr ähnlich ist, aber die Art, wie Sie Ihre Daten verstehen und diese Traversierung aufbauen, ist völlig anders.
Logische Programmiersprachen funktionieren normalerweise über die Prädikatauflösung . Eine Graphabfragesprache wie Cypher arbeitet mit einer Kombination aus Mustererkennung und expliziter Pfadangabe. Sie sind sehr unterschiedlich.
Tags und Links prolog neo4j graph-databases minikanren