将图形数据表示为键值对象

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)


pio*_*rek 5

似乎没问题 - 每个对象都有它,没有重复.它对"阅读和处理目的"有好处.但没有'最佳'代表.它总是取决于你的目的.你想要能够通过名称快速找到顶点吗?或按日期划分边缘?或者你想快速测试两个顶点是否连接?或者相反 - 您想快速修改图表的某些部分?每个目的都需要不同的数据库表数据结构