持久表达有向图的最标准文件格式和符号是什么?

sma*_*man 10 rdf file-format directed-graph graphml data-structures

我有兴趣坚持个人有向图.这个问题不是要求一个全面的图形数据库解决方案,而是一个我可以用来保存和单个任意有向图的文档格式. 我不知道符号和文件格式是最明智的选择.

我主要担心的是:

  1. 表现力/灵活性 - 我希望能够表达不同类型的图表.虽然标准用例是一个简单的有向图,但应该可以表达树,循环图,多图.作为最低限度,我希望支持边缘和节点的标记和加权.用于描述高图边缘合成/超边缘的符号也是非常需要的,尽管我知道这些解决方案可能不存在.

  2. 类型系统独立 - 我有兴趣表示图形的结构质量.一些解决方案包括用于类型化边缘和节点的可扩展类型系统(例如RDF/OWL).如果有明确定义的类型元素到基元(节点/边缘/属性)的规范分解,我只会对这种表示感兴趣.我在这里要避免的是能够进行等效图的多个表示,其中等价是不可辨别的.

  3. 规范表示 - 应该有一种机制允许图形被规范地表示(以这种方式,规范表示的词汇等价可以用来确定等价).

  4. 独立呈现 - 我更喜欢一种不依赖于图表表示的符号.这将包括空间方向,颜色,字体等.我只对表示数据感兴趣.我不喜欢DOT语言,DGMLSVG(至少对于这个特定目的)的一个特征是关注视觉表示.

  5. 标准化/开放/兼容 - 我必须做的实施工作越少越好.如果格式是标准化的并且已经存在用于处理格式的可靠工具,则更优选.伴随这个要求是另一个,格式应该是高度兼容的.微软DGML的专有性质是我厌恶的原因,尽管Visual Studio工具和我主要使用.NET(现在)的事实.W3C发布RDF标准的事实是将RDF的有限子集视为代表性工具的动机.我也很欣赏GXLGraphML,因为它们有很好的文档xml模式,因此有助于将数据与任何兼容xml的软件包集成.

  6. 简单/可读性 - 我欣赏人类可读的语法和易于解释.我也很欣赏能够简化解析的表示.出于这个原因,我喜欢GML,但我担心它不够主流,不能成为一个现实的选择.我还会考虑JSONYAML的可读性,如果它们各自能够代表复杂(非DAG)结构的能力不是那么有限的话.

  7. 效率/简洁表示 - 值得考虑的是,我最终选择的任何格式都不可避免地必须通过某些网络进行持久化和转移.因此,文件大小是一个相关的考虑因素.

概观

我意识到我很可能无法找到满足我愿望清单上所有标准的解决方案.我只要求是最接近我想要的文件格式,并且不限制可扩展性不支持的用例.

Jee*_*tra 1

ObWindyPreamble:在 RDF 世界中,有无数种不同的表面语法格式可供选择。RDF本身是数据的抽象元模型,而不是直接的“图语法”。当然,您可以直接用 RDF 表示图(因为 RDF 模型就是图),但是考虑到您想要表示不同类型的图,您可能最终必须进行抽象,并实际创建一个 RDF 词汇表来表示不同类型的图。图表。

总而言之,我不相信 RDF 是最适合您的方法,但如果您选择一种方法,我会说 RDF 的Turtle 语法值得研究。它确实满足了可读性和简单性的要求,并且是一个标准(嗯,几乎……W3C 正在努力标准化它)并拥有广泛的(开源)工具支持。

RDF 模型大致遵循集合语义,这意味着规范语法表示无法真正得到执行:两个文件可以具有不同顺序的信息,而不影响实际模型,甚至可以包含重复信息。然而,如果您在生成文件时强制执行简单的排序算法(大多数 RDF 解析器/编写器都支持这种算法),您应该能够摆脱基于行的比较并根据表面语法确定图形等价性。

作为一个简单的例子,我们假设我们有一个非常简单的、有向的、带标签的图:

 A ---r1---> B ---r2---> C
Run Code Online (Sandbox Code Playgroud)

您可以直接在 RDF 中表示这一点,如下所示(使用 Turtle 语法):

 @prefix : <http://example.org/> .

 :A :r1 :B .
 :B :r2 :C .
Run Code Online (Sandbox Code Playgroud)

在更抽象的建模中,您可以执行以下操作:

 @prefix g: <http://example.org/graph-model/> .
 @prefix : <http://example.org/> .

 :A a g:Vertex .
 :B a g:Vertex .
 :C a g:Vertex .

 :r1 a g:DirectedEdge ;
     g:from :A ;
     g:to :B .
 :r2 a g:DirectedEdge ;
     g:from :B ;
     g:to :C .
Run Code Online (Sandbox Code Playgroud)

当然,上面只是一个简单的例子,但希望它说明这可能满足您愿望清单上的很多事情。

顺便说一句,如果您想要更简单,N-Triples也是一种 RDF 语法,它是基于行的,因此易于以流方式处理。它比 Turtle 稍微详细一些,但它可能使文件比较更容易。