如何将有向无环图 (DAG) 存储为 JSON?

Posted

技术标签:

【中文标题】如何将有向无环图 (DAG) 存储为 JSON?【英文标题】:How do you store a Directed Acyclic Graph (DAG) as JSON? 【发布时间】:2012-04-11 11:33:03 【问题描述】:

我想将 DAG 表示为 JSON 文本,并想知道是否有人尝试过这个以及他们在验证 JSON 是否实际上是 DAG 时遇到的任何问题。

【问题讨论】:

如果 DAG 正确,DAG 可能没有一个根。那么,如果您不确定是否看到模型,如何将其晾干。 任何 JSON 对象都绝对是 DAG。 【参考方案1】:

除非您制定自己的约定来表示链接数据,否则 JSON 没有表示 DAG 的本机工具。 JSON-LD(一个 W3C 提案)是一个 JSON 扩展,它试图做到这一点。该提案可以在这里找到:http://json-ld.org/spec/latest/json-ld/。

【讨论】:

【参考方案2】:

标记每个节点并制作一个边列表。也就是说,对于每个节点,存储它具有边缘的节点,例如:


  "a": [ "b", "c", "d" ],
  "b": [ "d" ],
  "c": [ "d" ],
  "d": [ ]

您可以通过这种方式存储多种图形,而不仅仅是 DAG,因此您需要对其进行后处理以确保它没有循环。如果您多次看到任何节点不是 DAG,只需选择一个节点 DFS。然后删除您刚刚看到的所有节点并重复任何剩余的节点。执行此操作,直到找到循环或删除所有节点,在后一种情况下,图形是 DAG。

请注意,这不存储父节点,因为那是冗余信息。如果您需要这些数据,您可以在加载图表后生成这些数据。

【讨论】:

反向存储它有什么缺点(数组值是“从”节点而不是“到”)?如果您尝试进行拓扑排序,我认为这会更好。【参考方案3】:

严格来说,您不能直接使用 JSON 来实现。您必须想出自己的方式来表示可以通过数据结构中其他地方的引用来识别的对象,然后您必须对反序列化 JSON 字符串的结果进行后处理。

你不能用 JSON 来做到这一点,原因很简单,JSON 表达式 对象图,并且根本没有规定来表达属性的值应该是值的概念数据结构中其他地方的另一个属性。换句话说,图中的任何对象都不能有多个父对象,这意味着每个对象都是另一个对象的一个​​属性的值。

【讨论】:

在 DAG 中,一个节点可以有两个父节点。想一想编程语言(比如 javascript :-) 中表达式的表示,它有两个对单个变量的引用。传统上,表达式中的这两个点将引用同一个节点。 DAG 中没有循环(根据定义),因为(通常;我猜不一定)所有链接都“指向”图形,因此您永远不会“返回”。它就像一棵树,除了相似的节点被合并。 哈哈,那条评论是为了回答一个关于这与周期有关的问题,所以我把它留在那里。 是的,我的基本 CS 理解失败 ;-) 感谢您的解释。

以上是关于如何将有向无环图 (DAG) 存储为 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

DAG(有向无环图)有向树 转换为树

如何判断一个图是不是为有向无环图(DAG)

有向无环图——描述表达式

有向无环图描述表达式(C语言)

DAG(有向无环图)易懂介绍

有向无环图