Python';s图形工具:生成第n阶以上的egonet

Python';s图形工具:生成第n阶以上的egonet,python,graph,graph-tool,Python,Graph,Graph Tool,似乎没有内置函数来生成包含某个节点的所有相邻节点(直到n次)的子图。这个问题也可以被描述为使用n度邻居在节点周围构建一个电子网。让我们考虑下面的玩具例子: from graph_tool.all import * edge_list = [ [('node', 0), ('node', 1), 'xyz'], [('node', 1), ('node', 2)], [('node', 2), ('node', 3)], [('node', 3), ('node'

似乎没有内置函数来生成包含某个节点的所有相邻节点(直到n次)的子图。这个问题也可以被描述为使用n度邻居在节点周围构建一个电子网。让我们考虑下面的玩具例子:

from graph_tool.all import *

edge_list = [
    [('node', 0), ('node', 1), 'xyz'],
    [('node', 1), ('node', 2)],
    [('node', 2), ('node', 3)],
    [('node', 3), ('node', 4), 'abc'],
    [('node', 0), ('node', 4)],
    [('node', 4), ('node', 5)],
    [('node', 5), ('node', 6)],
    [('node', 6), ('node', 7)],
    [('node', 0), ('node', 8)],
    [('node', 7), ('node', 8)],
    [('node', 7), ('node', 9)],
    [('node', 9), ('node', 10)]
]

g = Graph(directed=False)
我添加了一些属性(顶点和边),以检查它们是否传播到子图:

edge_attributes = g.new_edge_property("string")
g.edge_properties['edge_attributes'] = edge_attributes

nodes_id = g.add_edge_list(edge_list, hashed=True, eprops = [edge_attributes] )
g.vertex_properties['nodes_id'] = nodes_id

bool_flg = g.new_vertex_property('int')
bool_flg.set_value(0)
bool_flg[4] = 1
g.vertex_properties['bool_flg'] = bool_flg
由于我从节点的外部名称开始,例如,
('node',0)
图形工具
库对连续的非负整数进行操作),因此我定义了一个节点id检索函数:

def find_vertex_id(G, node, id_mapping='nodes_id'):
    return int(find_vertex(G, G.vertex_properties[id_mapping], node)[0])
def graph_draw_enhanced(graph):
    graph_draw(graph, vertex_text=graph.vertex_index,
              vertex_fill_color = graph.vertex_properties['bool_flg'])
第一个(也是最耗时的)步骤(基于
networkx
解决方案)是生成连接到根节点的节点ID的步骤(满足egonet要求):

我还定义了一个绘图功能:

def find_vertex_id(G, node, id_mapping='nodes_id'):
    return int(find_vertex(G, G.vertex_properties[id_mapping], node)[0])
def graph_draw_enhanced(graph):
    graph_draw(graph, vertex_text=graph.vertex_index,
              vertex_fill_color = graph.vertex_properties['bool_flg'])
对于所提供的示例,我的自定义函数运行良好,但当提供一个包含8M个节点的网络时,该函数的运行速度开始减慢—计算4度egonet大约需要2,5分钟。在
图形工具
中,是否有更理想的方法来创建egonet

解决方案应返回一个子图,该子图包含与原始图相同的顶点和边信息

subgraph = generate_subgraph(g, ('node', 0), cutoff=2)

# check for edges
for edge in subgraph.edges():
    print(edge, g.edge_properties['edge_attributes'][edge])

# check for nodes
for node in subgraph.vertices():
    print(node, g.vertex_properties['bool_flg'][node])

使用graph tool的过滤功能,这实际上更容易做到。下面是一个简单的函数,它生成一个符合顺序的ego网络
n

def ego_net(g, ego, n): 
    d = shortest_distance(g, ego, max_dist=n) 
    u = GraphView(g, vfilt=d.a < g.num_vertices()) 
    return u
上述方法应该比问题中提出的更快

u = ego_net(g, ego, n)
u = Graph(u, prune=True)