Python中如何在数据库中存储有向图?

自己的一个小项目想要实现简易的知乎的话题功能,我基础差,技术也不咋的,就想找现成的,网上说需要实现有向图,在 v2 上发现有人问过:
https://www.v2ex.com/t/191083#reply11

然后我在 github 上发现了一个个人觉得非常不错的django库,实现了 dag :
https://github.com/elpaso/django-dag/tree/master/django_dag
看了它的单元测试,发现提供的功能对我来说完全够用了,另外如果节点很多很深的话可以把节点的祖父节点和子孙节点都缓存起来提高性能。
这个小项目做完去看看有向图和这个库的源码学习学习

不知道大家有实现过类似功能么,涨涨知识
Python中如何在数据库中存储有向图?


11 回复

不知道有啥意图……这是要通过存储的规则保证无环?


对于在数据库中存储有向图,最直接和常用的方法是使用邻接表模型。简单来说,就是创建一个表,其中每一行记录一条边,包含“起点”和“终点”两个字段。

这里是一个使用SQLite的完整示例:

import sqlite3

# 1. 连接数据库并创建表
conn = sqlite3.connect('directed_graph.db')
cursor = conn.cursor()

# 创建边表,存储有向关系
cursor.execute('''
CREATE TABLE IF NOT EXISTS edges (
    from_node TEXT NOT NULL,
    to_node TEXT NOT NULL,
    PRIMARY KEY (from_node, to_node)
)
''')

# 2. 插入边数据(代表有向连接)
edges = [('A', 'B'), ('A', 'C'), ('B', 'D'), ('C', 'D')]
cursor.executemany('INSERT OR IGNORE INTO edges (from_node, to_node) VALUES (?, ?)', edges)
conn.commit()

# 3. 查询示例:找出从节点A出发能到达的所有节点
print("从A出发可达的节点:")
cursor.execute('SELECT to_node FROM edges WHERE from_node = ?', ('A',))
for row in cursor.fetchall():
    print(f"  -> {row[0]}")

# 4. 查询示例:找出所有指向节点D的节点
print("\n指向D的节点:")
cursor.execute('SELECT from_node FROM edges WHERE to_node = ?', ('D',))
for row in cursor.fetchall():
    print(f"  {row[0]} ->")

conn.close()

核心思路: 这个edges表就是图的邻接表在数据库中的体现。每行一条有向边,查询时,找某个节点的“出边”就是WHERE from_node = ?,找“入边”就是WHERE to_node = ?。对于更复杂的查询(比如路径查找),你可能需要编写递归查询(在支持递归CTE的数据库如PostgreSQL中)或在应用层用代码实现图遍历算法。

简单总结:用邻接表存边,简单又灵活。

http://www.runoob.com/mongodb/nosql.html
里面有提到 图存储的 nosql 数据库

neo4j 就能搞。还有 orientdb, arangedb 都可以,

#1 是我标题没取对,主要是我涨知识了,分享给跟我一样的菜鸟,同时像大神取经

NEO4J 我用过,自己用,社区版还是可以的

请问用mysql实现的 dag 和现有的图形数据库相比,有什么优缺点呢,我现在还没深入理解原理和实现

twitter 有开源的 grapdb

邻接表

邻接矩阵,邻接表

做过可配置的计算工作流,数据用 graphml 表达,前端 jointjs ,解决有向图没问题,自己实现一个邻接表也不难

回到顶部