文章目录

  • Requirement
  • Snap操作手册
  • Basic Types
  • Vector Types
  • Hash Table Types
  • Pair Types
  • Graph and Networks Types(graph和network类型)
  • Node and Edge Operation


Requirement

  • 需要提前安装用于操作图网络的snap库,这个库中有很多现成的图数据库,很方便。
  • 用于图网络显示的两个库分别是
  • Gnuplot用于网络结构性质的绘制
  • Graphviz:用于绘制和可视化小图标记

Snap操作手册

Basic Types

  • Snap中的基础类型是TInt,TFlt和TStr.这些snap中的基础类型能够自动转成python中对应的基础类别int,float,str.总的来说,没有必要使用snap中特定的基础数据类型,因为snap会自动将数据转成相关类型

Vector Types

  • 在snap中vector的仅仅只能保存同一类型的数据,和python中的vector一样,可以通过索引改变特定位置的元素,也可以添加新的值。声明方式基本上都是数据类型后面加个V,会自动生成对应类型的vector.
  • python怎么操作nas盘的数据 python snap_python

  • 基本上是和python中的vector操作完全一样的,再加上二者是可以相互转换的,所以并没有必要专门学一下。

Hash Table Types

  • 就是键值对,不同于python中的就是所有的key必须要是同样的数据类型,这里哈希表的命名方式和python中的不同,需要在构造函数中就指明是那种类型的数据是key,那种类型的数据是value
  • 下面的代码中是声明了一个key为int,value是str类型的字典。如果要声明一个key为int,value为int的字典,那么只需要写一次就行了,TIntH()即可

Pair Types

  • 这里是数据对,相当于c++中的pair数据差不多,(value1,value2)为一个数据单位。声明方式为“T数据类型1数据类型2Pr”,这里需要指明你需要替代的数据类型1和数据类型2
  • 具体实现如下,基本上除了声明之后,就只用的到两个函数,分别是GetVal1和GetVal2

Graph and Networks Types(graph和network类型)

  • Snap支持graphs和networks,graphs单纯描述拓扑结构,其中节点拥有唯一的整数标记,节点与节点之间是通过有向边,或者无向边进行连接。网络network是节点或者边带有数据的graph。节点和边上的参数是通过模板参数进行传递的,这样能够处理很多数据。
  • SNAP中的graph如下
  • TUNGraph:无相图,无序节点对之间最多只有可能有一条边
  • TNGraph:有向图,有序节点对之间有一条边
  • network结构如下
  • TNEANet:有向 多重图,并且节点和边上还有相关的属性
  • 一般来说在snap中并不直接使用这些实例,而是使用指向这些实例的智能指针。在python中实际使用的是PUNGraph,PNGraph 和 PNEANet三个类型分别指代TUNGraph,TNGraph和TEANet.

Node and Edge Operation

  • 创建graph和net
G1 = snap.TUNGraph.New()
G2 = snap.TNGraph.New()
N1 = snap.TNEANet.New()
  • 增加节点和边
# 增加节点
G1.AddNode(1)
G1.AddNode(5)
G1.AddNode(32)
# 增加边,前提是节点一定要存在
G1.AddEdge(1,5)
G1.AddEdge(5,1)
G1.AddEdge(5,32)

遍历节点和边

  • 使用迭代器单纯遍历节点
  • python怎么操作nas盘的数据 python snap_开发语言_02

  • 使用迭代器遍历边
  • python怎么操作nas盘的数据 python snap_G1_03

  • 遍历每一个节点的连结的边
  • python怎么操作nas盘的数据 python snap_python怎么操作nas盘的数据_04

  • 使用的相关函数
  • GetId():返回节点的编号
  • GetOutDeg():返回节点的出度
  • GetInDeg():返回节点的入度
  • GetOutNId(e)返回第e个边的终点
  • GetInNId(e)返回第e个边的起点
  • IsOutNId(n):判定节点n是否拥有出边
  • IsInNId(n):判定节点n是否拥有入边
  • IsNbrNId(n):判断节点n是否为邻居节点
  • 上述几个代码还是比较重要的,在图的遍历过程中需要。

Saving and Loading Graphs

  • 使用snap你可以将网络保存为不同的格式,虽然snap会将函数保存为紧凑的二进制格式,但是也可以使用不同的文本、xml等格式来保存和加载图片。
  • 这里感觉对我没什么用,因为我主要是操作network,但是这里主要都是给的graph
  • 使用二进制保存和加载网络模型
  • 使用文本加载和保存网络模型
# 将文本保存为txt格式
G4.SaveEdgeList("test.txt", "Save as tab-separated list of edges")
# 加载txt文件的格式
G5 = snap.LoadEdgeList(snap.TNGraph, "test.txt", 0, 1)

Graph Manipulation (图操作和处理)

  • Snap支持一些常规的图操作,比如说找到最大的若链接部分,对节点的增删改查等操作
# 随机生成对应的graph图
G6 = snap.GenRndGnm(snap.TNGraph, 10000, 5000)
# 将有向图转为无向图,但是无向图转为有向图是不行的
G7 = G6.ConvertGraph(snap.TUNGraph)
# 找到途中最大的弱链接部分
WccG = G6.GetMxWcc()
# 使用森林火灾模型生成网络模型
G8 = snap.GenForestFire(1000,0.35,0.35)
# 获取特定节点构成的子图,这里是直接提出这几个节点作为子图
SubG = G8.GetSubGraph([0,1,2,3,4])
# 删除所有出度为3,入度为2的节点
G8.DelDegKNodes(3,2)

Computing Structural Properties (计算结构属性)

  • snap拥有很多函数支持计算网络模型的结构属性,同时支持network和graph
  • 设计一个二元数组,来获取链接图的分布,二元数组的构成是(链接图的节点数量,当前的总数)
  • 计算整个网络图的度数分布,主要是出度的分布

python怎么操作nas盘的数据 python snap_python_05

  • 获取图的邻接矩阵的特征向量,并以一个vector的形式返回
  • python怎么操作nas盘的数据 python snap_python怎么操作nas盘的数据_06

  • 获取图直径的近似
  • 图的直径:任意两个顶点之间的距离的最大值
  • 获取图的聚合系数
  • 更具体的,这里自己看相关的参考手册