如何在PostgreSQL中建模图形数据?

46

如何在Postgresql中存储和查询稀疏有向或无向图。类似pggraph的东西,但那还处于计划阶段。

我知道专用的图形数据库如Neo4J最适合此类数据,但是否有办法在Postgresql中实现相同的功能,使用扩展或数据类型,避免添加另一个数据库引擎。


1
目前,需求非常基本。能够建模实体之间的关系,并且能够高效地在图形中查询,避免连接操作。我的问题是是否有现成的解决方案可用。我已经阅读了 graphs-in-the-database-sql-meets-social-networks,但我只是想知道是否错过了某些明显的解决方案。 - jethar
8
这些IBM和Google的研究人员认为,传统智慧认为图形数据库最适合建模图形数据可能是错误的。为什么可能是错误的呢?我认为这归结于Postgres非常好用。很难制作一个在任何类别上都能与Postgres媲美的数据库,大多数尝试这样做的专业用例也无法成功。 - mako
1
大家好和@mako! 很高兴在这里见到你们。这些问题对我来说非常重要,因为作为初级开发人员,我花了三年时间从0.5版本到1.0版本测试TitanDB。我有很糟糕的经历(是我的问题吗?)与这些东西。每次我在图形建模中得到一些结果时,都会出现一些错误并阻碍我的开发。但是在这三年中,我使用Django + postgres创建了许多项目,它们正在运行。 - Dmitry Yudin
我相信语义网的东西通常归结为三元组。RDF、N3、Turtle都是三元组的一种形式。sparQL呢?https://www.youtube.com/watch?v=M0pcFgI2-uE - grantwparks
1
正在进行ISO标准的制定:https://www.gqlstandards.org/,可能适用于PostgreSQL 13或更高版本... - Christophe Roussy
2013年@jethar的评论中链接的文章仍然存在,但URL已更改。以下是更新后的URL:https://inviqa.com/blog/storing-graphs-database-sql-meets-social-network - vhs
5个回答

27

实际上,在 SQL 数据库中有效查询图形数据的一些技术,适用于高度专业化的场景。

例如,如果您的兴趣在于查找最短路径,可以选择维护GRIPP 索引。 (它基本上类似于预排序树索引,应用于图形。) 据我所知,目前没有这些技术被标准化。

话虽如此,并且看到您提到社交网络的评论,但很有可能每个方法都过于复杂。

如果您主要感兴趣的是获取与用户的好友相关的数据,或者是相当于查询节点邻域的东西,那么您将需要在连接中遍历的节点数量非常少,不需要专门的工具、数据结构等:只需使用递归 CTEs。

http://www.postgresql.org/docs/current/static/queries-with.html

WITH 提供了一种编写辅助语句以在较大查询中使用的方法。这些语句通常称为公共表达式或 CTE,可以被视为仅为一个查询而存在的临时表。

使用后者时,为了实现最佳性能,请尽可能将许多 where 条件移到查询的 with (...) 部分中,以便尽早消除节点。


1
我同意,这个问题很模糊,但是背后有一定的目的。我在过去的六个月中开始使用postgresql,对它的细微差别仍然很陌生,而且我不认为自己擅长使用高级主题。你提供的递归CTE链接很有帮助,因为它给出了有用的提示,这些提示我在谷歌搜索时无法获得。如果我没有得到更多有用的回复,我会点赞你的答案。谢谢。 - jethar

23
请使用PostgreSQL作为底层存储,并通过PL/Python使用networkXiGraph作为处理引擎。
在他们的书Graph Databases中,Ian Robinson、Jim Webber和Emil Eifrem区分了底层存储和处理引擎。如果您查看我最近解决问题所遵循的答案(请参见here),您将看到我正在使用PostgreSQL作为底层存储,使用networkX作为处理引擎。相对于我的原始解决方案,性能提升巨大(类似于“图形数据库”书中描述的性能提升),而且实现非常容易。

2
我建议转而使用iGraph,可以参考这个基准测试:http://graph-tool.skewed.de/performance 我也对Facebook子图数据进行了广泛的测试。 - Julius F

8

链接已经失效。请尝试使用以下链接:https://github.com/bitnine-oss/agensgraph - NateW
2
看起来他们进行了一些网站升级,现在网站已经恢复正常。 - Eron Lloyd
1
AgensGraph团队刚刚宣布他们正在为PostgreSQL开发他们的扩展,并且其beta版本将在明年初发布。我认为如果您正在使用PostgreSQL,那么AgensGraph可能是一个不错的选择,因为它基于PG并且其扩展即将推出。 - Eya
1
@Eya 这是个好消息!我已经期待多年了。这更加让我有理由去尝试一下。 - Eron Lloyd
3
AgensGraph的后继者是AGE扩展 - Ken Fehling
显示剩余2条评论

4
由于这个问题是普遍的,我想添加一个解决方案,可以适用于大多数平面图,比如街道网络 - PostgreSQL通过Postgis Topology提供了一个非常好的解决方案。

Postgis Topology将几何形状存储为边、节点和面以及它们之间的关系。这意味着从街道网络的几何形状中,您可以选择边和它们的起始和结束节点,并从此轻松地在您选择的处理引擎中构建图形(例如Python的networkx或graph-tool)。

正如我所说,Postgresql / Postgis Topology适用于从图分析的角度研究类似街道网络的几何形状。


0

使用来自bitnine.net的AgensGraphhttps://bitnine.net/

如果您想要可视化您的图形,您可以使用同样来自bitnine的AgensBrowser


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