为顶点添加自定义名称

问题描述

我想创建一个带有自定义顶点名称的图形。这可以用 MetaGraphs.jl 实现吗?

using MetaGraphs
using LightGraphs
using graphplot

# Create empty graph
gm = MetaGraph()

# Add vertices with properties
add_vertex!(gm,:A,[7.2,8.6])
add_vertex!(gm,:B,[3.2,6.7])
add_vertex!(gm,:C,[6.3,3.9])
add_vertex!(gm,:D,[2.4,6.7])

gplot(gm,nodelabel = vertices(gm))

然而,顶点的名称可能是 :A 而不是 1。由于在下一步中我想添加add_edge!(gm,:B) (这是不正确的,当前节点的名称为 1,2,3... ,因此创建边的方法add_edge!(gm,1,2)

enter image description here

换句话说,有 A,B,C,... 而不是 1,3。

解决方法

据我所知,在 MetaGraphs.jl 中这样做的一种方法是定义一个“索引属性”,例如 :name,其中将包含 :A:B

然后,如果我没记错的话,您可以使用语法 add_edge!(gm,gm[:A,:name],gm[:B,:name]) 添加边。至于绘图,您可以简单地使用 get_prop 检索属性。

,

最好的方法是像这样使用 set_indexing_prop!

g = MetaGraph(path_graph(3))
set_prop!(g,1,:name,'a')
set_prop!(g,2,'b')
set_prop!(g,3,'c')
set_indexing_prop!(g,:name)

然后,您可以引用名称,它们将被转换为顶点索引,它们是整数:

g['a',:name]  # returns 1
g['b',:name]  # returns 2
g['c',:name]  # returns 3
has_edge(g,g['b',g['c',:name])  # returns true