Представление графика в JSON


Вдохновленныйэтим вопросом, я пытаюсь представить DAG в JSON. Мой случай включает ребра и узлы, которые содержат некоторые данные (а не только строки, как в этом примере). Я думал о спецификации, как это:

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

    "nodes": {
        "a": {
            "name": "Adam"
        },
        "b": {
            "name": "Bob"
        },
        "c": {
            "name": "Caillou"
        }
    },

    "edges": {
        // how to do the same for edges?
        // ie: how to query edges ?
    }
}
Одна из моих идей состояла в том, чтобы сделать ключи ребер конкатенацией двух идентификаторов вершин, которые они соединяют. Например:, ab, ac, и bc - это три ребра в этом графе. Я хочу знать, есть ли более стандартный способ сделать это. этот.

EDIT: вот о чем я сейчас думаю

{
    "graph": {
        "a": {
            "data": {
                // a's vertex data
            },
            "neighbors": {
                "b": {
                    "data": {
                        // data in edge ab
                    }
                },
                "c": {
                    "data": {
                        // data in edge ac
                    }
                }
            }
        },
        "b": {
            "data": {
                // b's vertex data
            },
            "neighbors": {
                "c": {
                    "data": {
                        // data in edge bc
                    }
                }
            }
        },
        "c": {
            "data": {
                // c's vertex data
            }
        }
    }
}
2 3

2 ответа:

Поскольку ребра DAG содержат данные, им лучше иметь свои собственные идентификаторы, как и узлам. То есть представление json должно состоять из трех компонентов:

  1. записи узлов: сопоставление идентификатора каждого узла с данными узла.
  2. записи ребер: сопоставление каждого идентификатора ребра с данными ребра.
  3. Списки смежности: отображение каждого идентификатора узла в массив идентификаторов ребер, каждый из которых соответствует ребру, выходящему из узел.

    DAG = {
      "adjacency": {
        "a": ["1", "2"],
        "b": ["3"]
      },
      "nodes": {
        "a": {
          // data
        },
        "b": {
          // data
        },
        "c": {
          // data
        }
      },
      "edges": {
        "1": {
          "from": "a", "to": "b",
          "data": {
            // data
          }
        },
        "2": {
          "from": "a", "to": "b",
          "data": {
            // data
          }
        },
        "3": {
          "from": "b", "to": "c",
          "data": {
            // data
          }
        }
      }
    }
    

Оказывается, есть стандарты, которые пытаются появиться для такого рода вещей. Недавно мне пришлось искать их для собственного проекта. Возможно, вас заинтересует http://jsongraphformat.info/ например, или один из одноранговых проектов, на которые он ссылается на своем веб-сайте. Цели включают в себя попытку представить в JSON все, что вы можете представить на языке точек (https://en.wikipedia.org/wiki/DOT_(graph_description_language)).