18

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

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

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

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

编辑:也发现了有向边缘,但它似乎是商业产品

4

7 回答 7

5

我同时使用了Jena(一个 Java 框架)和Allegrograph(Lisp、Java、Python 绑定)。Jena 有用于存储图形数据的姊妹项目,并且已经存在了很长时间。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。

于 2010-01-02T04:24:43.980 回答
3

我认为解决方案实际上取决于您在设法将图形存储在磁盘/数据库中后要对它做什么,这在您的问题中有点不清楚。但是,您可能需要考虑以下几点:

  • 如果您只想在不使用 rdbms 解决方案(例如 ACID)的任何特性或属性的情况下保留图形,那么将对象腌制到平面文件中怎么样?非常初级,但就像我说的,这完全取决于你想要实现的目标。
  • ZODB是 Python 的对象数据库(我认为是 Zope 项目的衍生产品)。我不能说我在高性能环境中有很多经验,但是除了一些限制之外,您确实可以在本地存储 Python 对象。
  • 如果您想追求 RDF,有一个RDF Alchemy项目可能有助于减轻您对从图形转换为 RDF 结构的一些担忧,我认为 Sesame 作为其堆栈的一部分。

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

我取得的最大成功是将 MySQL 与自定义 ORM 一起使用,并且我在对这个问题的回答中发布了几个相关链接。此外,如果您想为 RDBMS 项目做出贡献,当我与 Open Query 的某个人谈论MySQL 的图形存储引擎时,他们似乎有兴趣积极参与他们的项目。

抱歉,我无法给出更明确的答案,但我认为没有……如果您确实开始开发自己的实现,我有兴趣了解您的最新进展。

于 2009-08-20T07:59:20.653 回答
2

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

一些有用的链接...

于 2011-02-13T20:23:11.697 回答
1

嗯,也许你应该看看CubicWeb

于 2009-08-20T09:22:03.887 回答
1

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

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

于 2009-09-03T09:39:41.453 回答
0

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

于 2011-07-17T19:56:52.290 回答
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>

于 2018-07-16T08:24:27.547 回答