Граф DB и Prolog (или miniKanren)

Недавно я изучал графические базы данных, такие как Neo4j, и в логическое программирование в Prolog и miniKanren. Из того, что я узнал до сих пор, оба позволяют указывать факты и отношения между ними, а также запрашивать полученную систему для некоторых выборов. Таким образом, на самом деле я не вижу большой разницы между ними в том, что они оба могут использоваться для построения графика и запроса, но с использованием другого синтаксиса. Однако они представлены как совершенно разные виды программного обеспечения.

Кроме того, что базы данных могут предлагать более эффективную технологию хранения в пространстве и времени, кроме того, что крошечные логические ядра, такие как miniKanren, более просты и встраиваются, какова фактическая разница между базами данных графов и языками логического программирования, если они оба просто API-интерфейс графика + запрос API?

Ответ 1

Нет, логическое программирование, воплощенное этими вещами и neo4j, совсем другое.

На одном уровне вы правы, что они концептуально равны как для хранения графа, так и для графового запроса. Но для логического программирования это только концептуально графовый запрос, там нет гарантии, что он фактически хранится таким образом (где с neo4j, это так).

Во-вторых, с логическим программированием вы обычно пытаетесь установить предложения рога, которые позволяют вам рассуждать множеством данных. Вы можете думать о роговой оговорке как о простом правиле, например: "Если человек является мужчиной и является прямым предком биологического ребенка, это означает, что человек является отцом". В cypher с neo4j вы бы описали шаблон графа, который вы хотите сопоставить, что приводит к данным, например:

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

Это говорит о том, чтобы пересечь график отношениями father и вернуть мужчин-предков. На логическом языке программирования вы не сделали бы этого так. Вы можете указать, что a является отцом b означает, что a является мужским, а a является предком b. Это косвенно и транзитивно означает, что для всех допустимых пар a/b. Тогда вы зададите вопрос: "Кто такие мужские предки"? Тогда среда программирования ответит на это, используя ваши правила. Это привело бы к созданию обхода через данные, которые очень похожи на шифр, указанный выше, но способ понять ваши данные и построить этот обход совершенно другой.

Языки логического программирования обычно работают через предикатное разрешение. Язык запросов графа, такой как cypher, работает комбинацией соответствия шаблонов и явным обозначением пути. Они очень разные.

Ответ 2

Есть несколько очень интересных параллелей между базой данных графов и логическим программированием. Довольно умно, что вы связали эти два.

Однако, хотя они абстрактно способны описывать одни и те же наборы данных, пролог обычно работает с небольшими наборами данных и выполняет сканирование в памяти. Это не база данных, и, конечно, она не подходит для масштабирования со многими/большинством ограничений в реальном времени, с которыми сталкиваются базы данных, а именно - большой объем записи в базу данных.

Такой язык, как Datomic, использует поднабор пролога (Datalog) в качестве языка запросов и может быть немного более совместимым с вашей идеей, но даже это далеко от LPG, такого как neo4j. Большая разница в том, что "помеченные ребра" между узлами со свойствами не являются концепцией первого порядка ни в чем, кроме LPG (насколько я могу судить). Хотя вы можете описать эти ребра или отношения между узлами, например, с помощью. объединяющая таблица для создания отношений "многие ко многим", они гораздо более подвижны в чем-то вроде neo4j.