web-dev-qa-db-ja.com

有向非巡回グラフ(DAG)をJSONとしてどのように保存しますか?

DAGをJSONテキストとして表現したいのですが、誰かがこれを試したかどうか、JSONが実際にDAGであるかどうかの検証に関して彼らが扱った問題があるかどうか疑問に思います。

30
828

各ノードにラベルを付け、エッジリストを作成します。つまり、ノードごとに、エッジのあるノードを格納します。次に例を示します。

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

この方法では、DAGだけでなく、さまざまな種類のグラフを保存できるため、ループがないことを確認するために後処理する必要があります。 DAGではないノードが複数回表示される場合は、ノードDFSを選択するだけです。次に、今見たすべてのノードを削除し、残りのノードで繰り返します。ループが見つかるか、すべてのノードを削除するまでこれを行います。後者の場合、グラフはDAGです。

これは冗長な情報であるため、親ノードは保存されないことに注意してください。そのデータが必要な場合は、グラフのロード後にそれらを生成できます。

34
Running Wild

リンクされたデータを表す独自の規則を作成しない限り、JSONにはDAGを表すネイティブ機能がありません。 JSON-LD(W3C提案)は、まさにそれを実行しようとしているJSON拡張機能です。提案はここで見つけることができます: http://json-ld.org/spec/latest/json-ld/

4
dave

厳密に言えば、JSONで直接行うことはできません。データ構造の他の場所で参照によって識別できるオブジェクトを表す独自の方法を考え出す必要があります。次に、JSON文字列の逆シリアル化の結果を後処理する必要があります。

JSON式isオブジェクトグラフという単純な理由でJSONでそれを行うことはできません。また、プロパティの値は別のプロパティの値である必要があるという概念を表現するための規定がありません。データ構造の他の場所。言い換えると、グラフ内のオブジェクトに複数の親を含めることはできません。これは、すべてのオブジェクトが他の1つのオブジェクトの1つのプロパティの値であることを意味します。

1
Pointy