IGraph使用实例——图属性设置2之GML或GraphML输出

 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输出

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值