2015-03-22 15 views
8

Geçtiğimiz günlerde Neo4j gibi grafik veritabanlarına ve Prolog ve miniKanren programlarına mantıksal programlamaya bakıyorum. Şimdiye kadar öğrendiklerime göre, ikisi de gerçekleri ve aralarındaki ilişkileri belirlemeye ve sonuçta ortaya çıkan sistemi bazı seçimler için sorgulamaya izin veriyor. Yani, aslında ikisi arasında bir fark göremiyorum ki her ikisi de bir grafik oluşturmak ve sorgulamak için kullanılabilir, ancak farklı sözdizimi kullanarak. Ancak, tamamen farklı yazılım türleri olarak sunulur. belki daha uzay-zaman etkili depolama teknolojisini önermek ve miniKanren gibi o küçücük mantık çekirdekleri daha basit ve katıştırılabilecek dışında her ikisi de varsa, grafik veritabanları ve mantık programlama dilleri arasındaki gerçek fark nedir veri tabanları teknik bir haricinde A graph DB vs a Prolog (veya miniKanren)

sadece bir grafik veritabanı + sorgu API'sı?

+3

Prolog bir * programlama dili *, bir grafik veritabanı ise yalnızca bir veri tabanıdır. Prolog ile yapabileceğiniz çoğu şeyin sadece bir veritabanı ile gerçekleştirilmesi imkansızdır. Örneğin, SWI-Prolog [web sitesi] 'ne (http://www.swi-prolog.org) güç veren bir web sunucusu oluşturmak Prolog ile mümkündür, ancak sadece bir veritabanı motoruyla imkansızdır. – mat

+1

saklı yordamları ekleyin ve grafik veritabanını tetikler, atfedilen AST'ye ayrıştırılan bazı kaynak kodlarını yükleyin (bu, doğal olarak bir grafiktir) ve db yürütür veya bu AST'yi dönüştürürsünüz. –

cevap

9

Hayır, bu şeyler ve neo4j tarafından somutlaştırılan mantıksal programlama oldukça farklıdır.

Bir düzeyde, onlar kavramsal olarak hem grafik depolama hem de grafik sorgulama için yeterlidir. Fakat mantıksal programlama için, sadece kavramsal olarak grafik sorgulamadır, aslında bu şekilde depolandığına dair bir garanti yoktur (neo4j ile olduğu yerde).

İkinci olarak, mantıksal programlama ile genellikle çok sayıda veriyi kullanmanıza izin veren horn clauses'u kurmaya çalışıyorsunuz. Bir horn maddesini basit bir kural olarak düşünebilirsiniz, "Bir insan erkektir ve biyolojik çocuğun doğrudan atası ise, bu da kişinin bir baba olduğunu gösterir" gibi. Neo4j ile cypher olarak, örn verilerdeki sonuçları, .:

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

Bu father ilişkiler grafiği hareket etmesi söyler, eşleşmek istediğiniz bir grafik desen tanımlamak ve erkek ataları dönecekti. Bir mantıksal programlama dilinde, bu şekilde yapmayacaksınız. a'un b'un bir babası olmasının a'un erkek olduğunu ve a'un b'un atası olduğunu belirtirsiniz. Bu, geçerli tüm a/b eşleştirmeleri için örtülü ve geçici bir şekilde geçerli olacaktır. O zaman, "erkek ataları kimdir?" Programlama ortamı daha sonra kurallarınızı kullanarak size cevap verecektir. Bu, yukarıda belirttiğim cildiye çok benzeyen veriler üzerinden bir geçiş yapmanın etkisine sahip olacaktır, ancak verilerinizi anlamak ve bu geçişi inşa etmenin yolu tamamen farklıdır.

Mantıksal programlama dilleri genellikle predicate resolution aracılığıyla çalışır. Cypher gibi bir grafik sorgulama dili, desen eşleştirmesi ve açık yol belirtiminin birleşimiyle çalışır. Çok farklılar.

+0

büyük yanıt ... 2 şey benim için meydana geldi: (1) Demorgan kuralları, ayrılmayı imalata dönüştürür, bu nedenle, tüm boynuz cümleleri, tüm okların ima ettiği (bu bir neo db'ye sığabilecek şekilde) bazı yöneltilmiş grafiklere izomorfik olmalıdır. (2) yeni bir veritabanının meta grafiğini yorumlamak, düğüm mantığı, ilişki türleri ve biçimsel mantıkta kolayca temsil edilebilen ve bir akıl yürütücü tarafından işlenen özellikler arasında bir ilişki ortaya çıkarır. Yaptığım nokta, farklı olsa da, grafik sorgulama ve mantıksal programlama uyumlu ve potansiyel olarak tamamlayıcıdır. – smartcaveman

+0

Anlaşılır, uyumludur ve kısıtlı bir şema üzerinde bir akıl yürütücüyü uygulayan neo4j grafiğinin tamamlayıcısı mantıklı olacaktır.Ancak çoğu insan, bir yaklaşımı veya diğerini seçtikten sonra, örtülü olarak kod/veri hakkında belirli bir düşünme modelini seçecektir. Onlar * dokunabilirdi, ama genelde değiller. Prolog'un N-ary yüklemleri için – FrobberOfBits

+0

, hipergrafilere bakıyor - daha fazla yerel temsillere bakıyorlar –