2009-08-19 159 views
19

我需要在python中开发一个图形数据库(如果有人可以加入我的开发过程,我会很开心的,我已经有了一些代码,但是我很乐意讨论关于它)。图形数据库和RDF三重存储:使用python存储图形数据

我在互联网上做了我的研究。在Java中,neo4j是一个候选人,但我无法找到有关实际磁盘存储的任何信息。在Python中,有许多graph data models(见本PEP前期建议,但他们没有满足我的需要存储和从磁盘检索。

我不知道triplestores,但是。triplestores基本上都是RDF数据库,所以图数据模型可以在RDF中映射并存储,但我通常对此解决方案感到不安(主要是由于缺乏经验),例如Sesame。事实是,无论如何,您都必须从内存中的图表表示到RDF表示,反之亦然,除非客户端代码想要直接破解RDF文档,这是不太可能的,这将会像直接处理DB元组,而不是创建对象。最先进的存储和python中图表数据的检索(a la DBMS)?希望在有兴趣的人的帮助下开始开发一个实现,并与Graph API PEP的提议者合作,是否有意义?请注意,这将是我的工作在未来几个月的一部分,所以我对这个最终项目的贡献真的是太严重;)

编辑:发现也directededge,但它似乎是一个商业产品

回答

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 . 
} 

这当然产量< http://mycompany.com#5的>。

另一位候选人是用纯Java编写的Mulgara。既然你看起来对Python更感兴趣,但我认为你应该首先看一下Allegrograph。

+0

我的确在考虑Allegro。 – 2010-02-23 10:31:12

+0

我可以使用RDF和SPARQL轻松应用一些图分析吗?例如,两个节点之间的距离,最短路径,遍历? – elgcom 2010-09-02 20:56:19

+0

不是我知道的... BTW这个问题是一个很好的候选人http:// www。semanticoverflow.com – harschware 2010-09-03 18:31:25

3

我认为解决方案确实取决于你想要对图形做什么,一旦你设法将它存储在磁盘上/数据库中,这在你的问题上有点不清楚。但是,您不妨考虑几件事情是:

  • ,如果你只是想坚持的图形,而无需使用任何你可能期望从一个RDBMS解决方案(如ACID)特征或属性,那么如何关于只是将物体腌制成平面文件?非常简陋,但正如我所说,取决于你想要达到的目标。
  • ZODB是一个用于Python的对象数据库(我认为是从Zope项目中分离出来的)。我不能说我在高性能环境中已经有过很多经验,但是禁止一些限制允许您本地存储Python对象。
  • 如果你想追求RDF,那么有一个RDF Alchemy项目可能有助于减轻你对图转换为RDF结构的担忧,我认为芝麻是它的一部分。

有上可能会感兴趣的蟒蛇网站的详细一些其他persistence tools,但我花了相当长的一段寻找进入这个领域,去年,最终我发现有没有能够满足原来的Python的解决方案我要求。

我最大的成功就是使用MySQL自定义ORM,并且我在this question的答案中发布了一些相关链接。此外,如果您想为RDBMS项目做出贡献,当我与来自Open Query的人讨论a Graph storage engine for MySQL时,他们似乎很想积极参与他们的项目。

对不起,我不能给出更明确的答案,但我不认为有一个...如果你开始开发你自己的实现,我会有兴趣跟上你的发展方向。

0

瑞德兰德(http://librdf.org)可能是您正在寻找的解决方案。它也有Python绑定。