如何存储图形?

7
假设我有一个已定义的类 Graph。
graph iowa = {.....nodes:{edges.......}}

以及类似的图簇。

一旦脚本运行,所有内容都在对象中。

但是,如何存储图形信息(包括定义的任何属性)? 您将其保存在数据库表、csv 中吗?

可能不令人满意的查询: 在Neo4J中存储多个图形 (它说newo4j一个实例一次只支持一个图形,并且要在一个图形下建立子图形,如果您想运行多个图形)

如何将图形数据存储在数据库中?

*****更新*****: 在亚历山大的答案下,关于可用的图形DB,我想知道 是否有人知道VertexDB的可能分支,在其中导入了这个高性能库到任何其他语言,最好是NodeJS或Python?

http://www.dekorte.com/projects/opensource/vertexdb/docs/manual.html

还有人有使用AllegroGraph与Neo4j读取此内容的经验吗?


1
邻接矩阵和边列表是最简单的格式(带有某种键值数据库用于有效负载)。如果您不想实现它,请使用pickle:http://pymotw.com/2/pickle/。(只需小心递归限制) - lucasg
@georgesl,我可以使用numpy创建矩阵并存储值和键。但是,那么这些矩阵值应该存储在哪里?以及存储格式应该是什么呢? - user2290820
3个回答

9

NetworkX是一个Python库,提供了几种存储图形数据的方式:

  1. 将图形序列化为JSON格式
  2. 使用Pickle对图形进行序列化
  3. 将图形以gml格式存储(链接
  4. 将图形写入.dot文件(链接)。
在关系型数据库中存储图形绝对是一个不好的选择,因为数据的复杂性、图形查询的复杂性以及这些查询的性能都很难用SQL编写。图形数据库、NOSQL和Neo4j文章详细描述了这个问题。
然而,我认为你应该真正考虑使用Neo4j。我希望在一些调查后,你能找到一种适应它的方法。毕竟,有很多Neo4j的替代品DB-engines是一个很好的资源。那里有很多有用的信息,特别是你可以比较任何数据库并找到最适合你的那个。
Also,你可以参考这个优美的答案
更新:

由于您使用的是类似于JSON的结构,因此可以考虑使用面向JSON的数据库,例如CouchDBMongoDB。它们具有良好的性能并且比Neo4j更容易扩展。


1
感谢您提供的所有实用解决方案,加1分。我开始使用NetworkX,但是由于我认为对于小规模使用和刚开始使用来说,自己从头创建图形模块会更好理解,当然调试需要时间,但是NetworkX的教程和文档很长,包括各种图形类型和算法实现等。 - user2290820

2
如果您的图形数据存储在字典中,使用json.dump()可以很容易地将其写入json文件,并使用json.load()加载回内存。如果它是一个字典列表,则应使用json.dumps()和json.loads()。Python文档在这里

没错,你说得对。是的,它是以字典形式存在的。嘿,顺便看看ujson吧。那么你的意思是将所有图形都存储为JSON格式,每个图形一个文件-JSON? - user2290820
这肯定是一个选项。根据你的文件大小,启动程序时加载它们可能需要一些时间,但一旦加载到字典中,你应该可以快速访问数据。 - ChrisProsser

2

VertexDB实现了RESTful API来提供查询工具,因此使用Python不会成为问题,因为您需要做的就是向服务器编写适当的HTTP请求。


我也喜欢您提供的链接 https://dev59.com/v2ox5IYBdhLWcg3wSCfk#9645518; 我想我会选择它。我以后还应该研究一下,等我对这个更加熟悉了,因为这是纯 C 实现的,应该会更快吧。 - user2290820

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接