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

如何将有向无环图(DAG)存储为JSON?,json,data-structures,directed-acyclic-graphs,Json,Data Structures,Directed Acyclic Graphs,我想将一个DAG表示为JSON文本,并想知道是否有人尝试过这个方法,以及他们在验证JSON是否确实是一个DAG时遇到的任何问题。严格来说,您不能直接使用JSON。您必须想出自己的方法来表示可以通过引用在数据结构中其他地方识别的对象,然后必须对反序列化JSON字符串的结果进行后期处理 您不能使用JSON,原因很简单,JSON表达式是对象图,并且对于表示属性的值应该是数据结构中其他地方的另一个属性的值这一概念没有任何规定。换句话说,图形中的任何对象都不能有多个父对象,这意味着每个对象都是另一个对象的

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

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


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

标记每个节点并创建一个边列表。也就是说,对于每个节点,存储其具有边的节点,例如:

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


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

JSON没有表示DAG的本机功能,除非您制定自己的表示链接数据的约定。JSON-LD(W3C提案)是一个JSON扩展,正试图做到这一点。建议可以在这里找到:。

如果我正确理解DAG,DAG可能没有一个根。所以,如果你不确定自己是否看到了模型,你该如何干燥它。任何JSON对象都肯定是DAG。在DAG中,一个节点可以有两个父节点。想象一下用编程语言(比如JavaScript:-)表示一个表达式,其中对一个变量有两个引用。传统上,表达式中的这两点将引用同一节点。DAG(根据定义)中没有循环,因为(通常;我猜不一定)所有链接都指向图形的下方,所以您永远不会“返回”。它就像一棵树,除了相似的节点被合并的地方。哈哈哈,这个评论是针对一个关于这与周期有关的问题的,所以我将把它放在那里。是的,基本的CS理解我的失败;-)感谢您的解释。反向存储有什么缺点吗(数组值是“from”节点而不是“to”)?我认为如果你尝试做拓扑排序,这会更好。