1 概述
1.1GML
Graph Modeling Language (GML) 是一种用于描述图形结构的文本格式,它提供了为节点和边分配属性的灵活性。以下是关于GML的详细解释:
1)定义与用途:
GML是一种通用的图形表示语言,常用于表示网络、图像、地图等复杂结构的数据。
它允许用户为图中的顶点(节点)和边定义属性,这使得GML成为一种非常灵活的数据格式。
2)基本结构:
GML文件通常包含一个graph元素作为根元素。
graph元素内部可以包含node和edge元素,分别表示图中的节点和边。
每个node元素可以包含多个属性,如id(节点ID)、label(节点标签)等。
每个edge元素也可以包含多个属性,如source(起始节点ID)、target(目标节点ID)、label(边标签)等。
3)特性:
灵活性:GML允许用户为节点和边定义任意数量的属性,这使得它非常适合用于表示复杂的网络数据集。
简单性:GML是一种基于文本的格式,因此它非常易于阅读和编辑。
可扩展性:由于GML是基于XML的,因此它可以轻松地与现有的XML工具和技术进行集成。
4)应用:
GML在地理信息系统(GIS)中常被用作表示地理空间信息的格式。
在社交网络分析、生物信息学等领域,GML也被广泛用于表示和分析复杂网络数据。
1.2 GraphML
GraphML是一种用于表示图形结构的XML格式,它特别适用于描述节点(或顶点)和边(或链接)之间的关系,以及这些元素上的属性。以下是关于GraphML的详细解释:
1)定义与用途:
GraphML是图形建模语言(Graph Modeling Language)的缩写,它是一种通用的图形交换格式,设计用于描述复杂的图形结构。
它允许用户定义图形中的节点、边以及它们的属性,使得图形数据可以以一种标准且易于理解的方式进行存储和交换。
2)基本结构:
GraphML文件通常包含一个或多个graph元素,每个graph元素代表一个图形。
在graph元素内部,可以包含node和edge元素,分别代表图形中的节点和边。
node和edge元素可以包含多个属性,用于描述节点和边的特性,如id(唯一标识符)、label(标签)等。
3)特性:
灵活性:GraphML允许用户为节点和边定义任意数量的属性,并且支持自定义的数据类型。这使得GraphML成为一种非常灵活且可扩展的图形交换格式。
可读性:由于GraphML是基于XML的,因此它具有良好的可读性和可编辑性。用户可以使用文本编辑器直接查看和修改GraphML文件。
支持多种图形类型:GraphML支持有向图、无向图、混合图等多种图形类型,并且支持超图、层次图等复杂图形结构。
丰富的扩展机制:GraphML提供了丰富的扩展机制,允许用户添加自定义的元素和属性,以满足特定的应用需求。
4)应用:
GraphML广泛应用于图形分析、社交网络分析、生物信息学等领域。在这些领域中,图形数据通常以节点和边的形式表示,GraphML提供了一种方便的方式来存储、交换和分析这些数据。
支持GraphML格式的软件有很多,如yEd、Tulip、Gephi等,这些软件可以帮助用户创建、编辑和可视化GraphML文件。
虽然GML(Graph Modelling Language)和GraphML都是用于描述图形结构的语言,但它们在语法和用途上有所不同。GML更侧重于图形的建模和表示,而GraphML则更侧重于图形的交换和存储。GraphML在可读性和可扩展性方面优于GML,因为它基于XML标准,具有更好的语法结构和扩展机制。
2 运行环境
操作系统:win10 64位
编程语言:C/C++
编译平台:vs2019 x64 debug | release
igraph版本: 0.10.12
3 示例代码
这段代码的主要作用是使用 igraph
库来创建一个图(具体为“Petersen”图),为该图及其顶点和边设置一些属性,然后将这些图以GML和GraphML格式写入标准输出。
#include <igraph.h> // 引入igraph库,这是一个广泛使用的网络分析库
int main(void) {
igraph_t g; // 定义一个igraph_t类型的变量g,用于存储图
igraph_vector_t y; // 定义一个igraph_vector_t类型的变量y,用于存储顶点或边的ID
igraph_warning_handler_t* oldwarnhandler; // 定义一个指向igraph_warning_handler_t的指针,用于保存原始的警告处理函数
/* 开启属性处理。 */
igraph_set_attribute_table(&igraph_cattribute_table); // 设置igraph使用C语言的属性表
/* 创建一个图,添加一些属性,并将其保存为GraphML文件。 */
// 创建"Petersen"图
igraph_famous(&g, "Petersen");
// 为图设置属性
SETGAS(&g, "name", "Petersen's graph"); // 设置图的"name"属性为"Petersen's graph"
SETGAN(&g, "vertices", igraph_vcount(&g)); // 设置图的"vertices"属性为图的顶点数
SETGAN(&g, "edges", igraph_ecount(&g)); // 设置图的"edges"属性为图的边数
SETGAB(&g, "famous", true); // 设置图的"famous"属性为true
// 为图的每个顶点创建一个ID属性,ID从1到顶点数
igraph_vector_init_range(&y, 1, igraph_vcount(&g) + 1);
SETVANV(&g, "id", &y); // 为图的每个顶点设置"id"属性,使用y中的值
igraph_vector_destroy(&y); // 销毁y向量,释放内存
// 为特定的顶点设置属性
SETVAS(&g, "name", 0, "foo"); // 设置第一个顶点的"name"属性为"foo"
SETVAS(&g, "name", 1, "foobar"); // 设置第二个顶点的"name"属性为"foobar"
SETVAB(&g, "is_first", 0, true); // 设置第一个顶点的"is_first"属性为true
// 为图的每条边创建一个ID属性,ID从1到边数
igraph_vector_init_range(&y, 1, igraph_ecount(&g) + 1);
SETEANV(&g, "id", &y); // 为图的每条边设置"id"属性,使用y中的值
igraph_vector_destroy(&y); // 销毁y向量,释放内存
// 为特定的边设置属性
SETEAS(&g, "name", 0, "FOO"); // 设置第一条边的"name"属性为"FOO"
SETEAS(&g, "name", 1, "FOOBAR"); // 设置第二条边的"name"属性为"FOOBAR"
SETEAB(&g, "is_first", 0, true); // 设置第一条边的"is_first"属性为true
/* 暂时关闭警告处理函数,因为GML写入器可能会因为布尔属性被转换为数字而发出警告,但我们不关心这些警告。 */
oldwarnhandler = igraph_set_warning_handler(igraph_warning_handler_ignore); // 保存原始警告处理函数并设置新的警告处理函数为忽略警告
// 将图以GML格式写入标准输出
igraph_write_graph_gml(&g, stdout, IGRAPH_WRITE_GML_DEFAULT_SW, 0, "");
// 恢复原始的警告处理函数
igraph_set_warning_handler(oldwarnhandler);
// 将图以GraphML格式写入标准输出,并包含属性的前缀
igraph_write_graph_graphml(&g, stdout, /*prefixattr=*/ true);
// 销毁图,释放其占用的内存
igraph_destroy(&g);
return 0;
}
4 运行结果
图1 GML输出
图1 GraphML输出