图形数据库和RDF三重存储:在python中存储图形数据

时间:2009-08-19 23:07:36

标签: python graph database graph-databases

我需要在python中开发一个图形数据库(我很乐意,如果有人可以加入我的开发。我已经有了一些代码,但我很乐意讨论它。)

我在互联网上做了我的研究。在Java中,neo4j是候选者,但我无法找到任何有关实际磁盘存储的信息。在python中,有许多graph data models(请参阅此PEP之前的提议,但它们都不能满足我从磁盘存储和检索的需要。

然而,我确实知道三重商店。三重存储基本上是RDF数据库,因此图形数据模型可以在RDF中映射并存储,但我通常对这个解决方案感到不安(主要是由于缺乏经验)。一个例子是Sesame。事实是,在任何情况下,你必须在内存中的图形表示转换为RDF表示,反之亦然,除非客户端代码想要直接破解RDF文档,这几乎是不可能的。这就像直接处理DB元组,而不是创建一个对象。

目前,python中图形数据的存储和检索( la DBMS)的最新技术是什么?是否有意义开始开发实现,希望在有兴趣的人的帮助下,以及与Graph API PEP的提议者合作?请注意,这将是我未来几个月工作的一部分,所以我对这个最终项目的贡献非常严重;)

修改:还找到directededge,但它似乎是商业产品

7 个答案:

答案 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)

我认为解决方案确实取决于您在设置将其存储在磁盘/数据库中后想要对图表做什么,这在您的问题中有点不清楚。但是,您可能希望考虑的几件事情是:

  • 如果您只想在不使用rdbms解决方案(例如ACID)的任何功能或属性的情况下保留图形,那么如何将对象腌制成平面文件呢?非常简陋,但就像我说的那样,取决于你想要实现的目标。
  • ZODB是Python的对象数据库(我认为是从Zope项目中脱离出来的)。我不能说我在高性能环境中有过很多经验,但是一些限制确实允许你本地存储Python对象。
  • 如果您希望继续使用RDF,那么有一个RDF Alchemy项目可能有助于减轻您对从图形转换为RDF结构的一些担忧,我认为芝麻是其堆栈的一部分。

python网站上还有一些其他的persistence tools可能很有意思,但去年我花了很长时间研究这个领域,最终我发现没有一个原生的Python解决方案满足我的要求。

我最成功的是使用MySQL和自定义ORM,我在this question的答案中发布了几个相关链接。此外,如果您想参与RDBMS项目,当我与Open Query中的某人谈论a Graph storage engine for MySQL时,他们似乎对积极参与他们的项目感兴趣。

抱歉,我无法给出更明确的答案,但我认为没有答案......如果你开始开发自己的实现,我有兴趣跟上你的最新动态上车。

答案 2 :(得分:2)

来自Serius Cyber​​netics Intelligent Agent的问候!

一些有用的链接......

答案 3 :(得分:1)

嗯,也许你应该看看CubicWeb

答案 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>