我需要在python中开发一个图形数据库(我很乐意,如果有人可以加入我的开发。我已经有了一些代码,但我很乐意讨论它。)
我在互联网上做了我的研究。在Java中,neo4j是候选者,但我无法找到任何有关实际磁盘存储的信息。在python中,有许多graph data models(请参阅此PEP之前的提议,但它们都不能满足我从磁盘存储和检索的需要。
然而,我确实知道三重商店。三重存储基本上是RDF数据库,因此图形数据模型可以在RDF中映射并存储,但我通常对这个解决方案感到不安(主要是由于缺乏经验)。一个例子是Sesame。事实是,在任何情况下,你必须在内存中的图形表示转换为RDF表示,反之亦然,除非客户端代码想要直接破解RDF文档,这几乎是不可能的。这就像直接处理DB元组,而不是创建一个对象。
目前,python中图形数据的存储和检索( la DBMS)的最新技术是什么?是否有意义开始开发实现,希望在有兴趣的人的帮助下,以及与Graph API PEP的提议者合作?请注意,这将是我未来几个月工作的一部分,所以我对这个最终项目的贡献非常严重;)
修改:还找到directededge,但它似乎是商业产品
答案 0 :(得分:6)
我使用了Jena(一个Java框架)和Allegrograph(Lisp,Java,Python绑定)。耶拿有姊妹项目用于存储图表数据,并且已经存在了很长时间。 Allegrograph相当不错并且有免费版本,我想我会建议这个因为它易于安装,免费,快速,你可以立即上手。学习一点RDF和SPARQL所获得的功能可能非常值得您花时间。如果您已经了解SQL,那么您将有一个良好的开端。能够使用SPARQL查询图形将为您带来一些巨大的好处。序列化为RDF三元组很容易,一些文件格式非常容易(例如NT)。我举个例子。假设您有以下图形节点边缘节点ID:
1 <- 2 -> 3 3 <- 4 -> 5
这些已经是主题谓词对象形式,所以只需在它上面写一些URI表示法,将其加载到三元组存储中并通过SPARQL随意查询。这是NT格式:
<http://mycompany.com#1> <http://mycompany.com#2> <http://mycompany.com#3> . <http://mycompany.com#3> <http://mycompany.com#4> <http://mycompany.com#5> .
现在从节点1查询所有节点两跳:
SELECT ?node WHERE { <http://mycompany.com#1> ?p1 ?o1 . ?o1 ?p2 ?node . }
这当然会产生&lt; http://mycompany.com#5&gt;。
另一个候选人是Mulgara,用纯Java编写。既然你似乎对Python更感兴趣,我认为你应该首先看一下Allegrograph。
答案 1 :(得分:3)
我认为解决方案确实取决于您在设置将其存储在磁盘/数据库中后想要对图表做什么,这在您的问题中有点不清楚。但是,您可能希望考虑的几件事情是:
python网站上还有一些其他的persistence tools可能很有意思,但去年我花了很长时间研究这个领域,最终我发现没有一个原生的Python解决方案满足我的要求。
我最成功的是使用MySQL和自定义ORM,我在this question的答案中发布了几个相关链接。此外,如果您想参与RDBMS项目,当我与Open Query中的某人谈论a Graph storage engine for MySQL时,他们似乎对积极参与他们的项目感兴趣。
抱歉,我无法给出更明确的答案,但我认为没有答案......如果你开始开发自己的实现,我有兴趣跟上你的最新动态上车。
答案 2 :(得分:2)
来自Serius Cybernetics Intelligent Agent的问候!
一些有用的链接......
答案 3 :(得分:1)
答案 4 :(得分:1)
关于Neo4j,您是否注意到现有的Python bindings?至于磁盘存储,请查看this thread上的mailing list。
对于Python中的graphdbs,Hypergraph Database Management System项目最近由Maurice Ling在SourceForge上启动。
答案 5 :(得分:0)
Redland(http://librdf.org)可能是您正在寻找的解决方案。它也有Python绑定。
答案 6 :(得分:0)
RDFLib是可以使用的python库。以harschware为例:
创建一个test.nt
文件,如下所示:
<http://mycompany.com#1> <http://mycompany.com#2> <http://mycompany.com#3> .
<http://mycompany.com#3> <http://mycompany.com#4> <http://mycompany.com#5> .
要查询所有节点从RDFLib中的节点1跳两跳:
from rdflib import Graph
g = Graph()
g.parse("test.nt", format="nt")
qres = g.query(
"""SELECT ?node
WHERE {
<http://mycompany.com#1> ?p1 ?o1 .
?o1 ?p2 ?node .
}"""
)
for row in qres:
print(node)
应返回答案<http://mycompany.com#5>
。