图数据库与RDF三元组存储:在Python中存储图数据
我想用Python开发一个图数据库(如果有人愿意一起参与开发就太好了。我已经有了一些代码,但很乐意和大家讨论一下)。
我在网上做了一些研究。在Java中,neo4j是一个不错的选择,但我找不到关于实际磁盘存储的相关信息。在Python中,有很多图数据模型(可以看看这个预提案),但没有一个能满足我存储和从磁盘读取数据的需求。
我知道三元组存储(triplestore),它基本上是RDF数据库,所以可以把图数据模型映射到RDF并存储,但我对这个解决方案总是有些不安(主要是因为缺乏经验)。一个例子是Sesame。事实上,无论如何,你都得把内存中的图表示转换成RDF表示,反之亦然,除非客户端代码想直接处理RDF文档,这种情况基本上不太可能。这就像直接处理数据库元组,而不是创建一个对象。
目前在Python中,图数据的存储和检索(类似于数据库管理系统)有什么最新的技术吗?开始开发一个实现是否有意义,希望能得到一些对这个项目感兴趣的人的帮助,并与Graph API PEP的提案者合作?请注意,这将是我接下来几个月工作的一部分,所以我对这个项目的贡献是非常认真的;)
编辑:我还发现了directededge,但它似乎是一个商业产品。
7 个回答
我觉得解决方案其实取决于你想在把图存储到磁盘或数据库后做什么,这在你的问题中有点不清楚。不过,有几个你可能想考虑的点:
- 如果你只是想保存图,而不需要关系型数据库管理系统(rdbms)提供的特性,比如ACID(原子性、一致性、隔离性和持久性),那么你可以考虑把对象序列化成一个简单的文件。这种方法很基础,但正如我所说,这要看你具体想实现什么。
- ZODB 是一个为Python设计的对象数据库(我想这是Zope项目的一个衍生品)。我不能说我在高性能环境下有太多的经验,但除了几个限制之外,它确实允许你原生存储Python对象。
- 如果你想使用RDF,有一个RDF Alchemy项目,可能会帮助你解决从图转换到RDF结构的一些问题,我认为它的技术栈中包含了Sesame。
在Python网站上还有一些其他的持久化工具,可能会对你有帮助。不过,我去年花了不少时间研究这个领域,最终发现没有一个原生的Python解决方案能满足我的需求。
我最成功的尝试是使用MySQL和一个自定义的ORM(对象关系映射),我在回答这个问题时分享了一些相关的链接。此外,如果你想参与一个RDBMS项目,当我和Open Query的某个人谈到MySQL的图存储引擎时,他们似乎对积极参与他们的项目很感兴趣。
抱歉我不能给出更明确的答案,但我觉得可能没有一个标准答案……如果你开始开发自己的实现,我会很感兴趣了解你的进展。
我用过两个工具,一个是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。