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

16

我对图表很新奇,这可能是一个初学者问题,请推荐一些好的材料。

我正在尝试制作一个小型社交网络,在这个网络中,每个用户都是一个节点,并与他的朋友有无向连接。

目前它工作得很好,但现在我想将它存储在数据库中。

如何存储数据?如何存储节点的所有连接(指针)。

用户注销后最好删除内存,当用户再次登录时从数据库读取,还是登录和注销不应对节点产生任何影响?

我知道这是理论上的问题。任何参考资料都将非常有帮助。

2个回答

10

使用实际的图形数据库来存储数据。

http://www.neo4j.org/

您可以在节点中存储键/值对,还可以存储连接节点的边缘。

然后,您可以使用类似 Gremlin 的工具查询/遍历图形-https://github.com/tinkerpop/gremlin。请参阅其文档以下载示例并运行样本查询:https://github.com/tinkerpop/gremlin/wiki/Getting-Started

语法的一个想法:

gremlin> // lets only take 'knows' labeled edges
gremlin> v.out('knows')
==>v[2]
==>v[4]
gremlin> // lets do a traversal from the '1' marko vertex to its outgoing edges.
gremlin> // in the property graph world, edges are first class citizens that can be traversed to.
gremlin> v.outE
==>e[7][1-knows->2]
==>e[9][1-created->3]
==>e[8][1-knows->4]

1
我从底部开始。

当用户注销后,删除内存并在其登录时从数据库中读取,还是登录和注销不应对节点产生任何影响,哪种方法更好?

您需要一些永久存储方式,否则在第一次崩溃/重启时丢失的所有数据可能会让您的用户感到不满。

如何存储数据? 如果没有更多信息,则很难确定,但假设您有一个用户列表,每个用户可以拥有0个或多个朋友,则我会使用2个表。

  • Users(用户)- 存储您的所有用户信息,例如用户名和密码
  • UsersFriends(用户朋友)* - 以UserID -> UserID(用户ID-用户ID)的方式存储所有关系 *

示例

用户表

UserID  Username
1       user2511713
2       abstracthchaos
3       anotheruser

用户好友

UserID    FriendUserID
1           3
2           3
1           2

意味着user2511713与另一个用户和abstracthchaos是朋友,而abstracthchaos与另一个用户是朋友。根据您的业务逻辑,暗示另一方向也可能很有用,比如31与13相同


1
如果我这样做(第二个表),那么图形的用途是什么?这一切都归结于我的数据库效率,而不是我使用的数据结构。 - user2511713

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