Mir*_*lov 18 language-agnostic graph key-value graph-databases
我开始深入研究图形数据库,但我不知道这些图形是如何在内部存储的.假设我有这张图(取自维基百科):

如何将此图表序列化为键值对象?(例如Python dict)
我想象两个dicts,一个用于顶点,一个用于边缘:
{'vertices':
{'1': {'Name': 'Alice', 'Age': 18},
'2': {'Name': 'Bob', 'Age': 22},
'3': {'Type': 'Group', 'Name': 'Chess'}},
'edges':
{'100': {'Label': 'knows', 'Since': '2001/10/03'},
'101': {'Label': 'knows', 'Since': '2001/10/04'},
'102': {'Label': 'is_member', 'Since': '2005/7/01'},
'103': {'Label': 'Members'},
'104': {'Label': 'Members'},
'105': {'Label': 'is_member', 'Since': '2011/02/14'}},
'connections': [['1', '2', '100'], ['2', '1', '101'],
['1', '3', '102'], ['3', '1', '103'],
['3', '2', '104'], ['2', '3', '105']]}
Run Code Online (Sandbox Code Playgroud)
但我不确定,这是否是最实用的实施方案.也许"连接"应该在"顶点"字典内.那么,使用键值对象实现图数据存储的最佳方法是什么?我可以在哪里以及在哪里阅读更多相关内容?
可能相关但不重复:如何在某些数据结构中表示奇怪的图形
Eam*_*ain 11
正常模式是没有单独的connections结构,而是将该信息放入edges结构中.这给出了类似的东西:
{
'vertices': {
'1': {'Name': 'Alice', 'Age': 18},
'2': {'Name': 'Bob', 'Age': 22},
'3': {'Type': 'Group', 'Name': 'Chess'} },
'edges': [
{'from': '1', 'to': '2', 'Label': 'knows', 'Since': '2001/10/03'},
{'from': '2', 'to': '1', 'Label': 'knows', 'Since': '2001/10/04'},
{'from': '1', 'to': '3', 'Label': 'is_member', 'Since': '2005/7/01'},
{'from': '3', 'to': '1', 'Label': 'Members'},
{'from': '3', 'to': '2', 'Label': 'Members'},
{'from': '2', 'to': '3', 'Label': 'is_member', 'Since': '2011/02/14'} ] }
Run Code Online (Sandbox Code Playgroud)
似乎没问题 - 每个对象都有它,没有重复.它对"阅读和处理目的"有好处.但没有'最佳'代表.它总是取决于你的目的.你想要能够通过名称快速找到顶点吗?或按日期划分边缘?或者你想快速测试两个顶点是否连接?或者相反 - 您想快速修改图表的某些部分?每个目的都需要不同的数据库表数据结构