繁体   English   中英

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

[英]Graph databases and RDF triplestores: storage of graph data in python

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

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

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

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

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

我使用过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 >。

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

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

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

python网站上有一些其他的持久性工具可能很有意思,但是去年我花了很长时间研究这个领域,最终我发现没有符合我要求的原生Python解决方案。

我最成功的是使用MySQL和自定义ORM,我在这个问题的答案中发布了几个相关链接。 此外,如果您想为RDBMS项目做贡献,当我与Open Query中有人讨论MySQL的Graph存储引擎时,他们似乎对积极参与他们的项目感兴趣。

对不起我无法给出更明确的答案,但我认为没有...如果你开始开发自己的实现,我有兴趣了解你的最新情况。

来自您的Serius Cyber​​netics智能代理的问候!

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

嗯,也许你应该看看CubicWeb

关于Neo4j,您是否注意到现有的Python绑定 至于磁盘存储,请查看邮件列表中的此线程

对于Python中的graphdbs,最近由Maurice Ling在SourceForge上启动了Hypergraph数据库管理系统项目。

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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM