查找具有相同边属性的所有顶点

时间:2013-07-01 13:55:13

标签: python graph igraph

我想通过使用Igraph找到所有顶点(顶点id)共享相同的边缘属性(因此可以有很多这样的顶点)。当我想在“道路”上找到所有“村庄”(我的图的顶点)时,这将非常方便,让我们说“Route 69”(边缘属性)。

Igraph有一种简单的方法吗?也许我过于复杂了。

实际上我需要的是:g.es.select(_within=g.vs[2:5])

>>> men = g.vs.select(gender="m")
>>> women = g.vs.select(gender="f")
>>> g.es.select(_between=(men, women))

因为我知道边缘属性,但我不知道顶点。

我将选择边缘并希望它将返回所有相关的顶点。

也许我现在只是累了,但我找不到解决这个问题的方法。如果有人以正确的方式帮助我,我感激不尽。或者也许我在tutorial和文档中遗漏了一种方法。它闻起来有一种非常简单的方法。 提前感谢您的任何建议!

2 个答案:

答案 0 :(得分:3)

您应该能够执行以下操作:

r69edges = g.es.select(name_eq='Route69')  #Select all edges where name=='Route69'
sg = r69edges.subgraph()  #Create a subgraph containing only the selected edges (and attached vertices)
village_verts = sg.vs.select(name_eq='villages')  #Select the vertices where name=='villages'

这假设'villages'和'Route69'存储在顶点和边上名为'name'的属性中......适当调整以匹配您的属性。

当然 - 如果你愿意,你可以把这一切都压成一行:

village_verts = g.es.select(name_eq='Route69').subgraph().vs.select(name_eq='villages')

不确定这是否是最有效的方法(虽然我在文档中没有看到任何快捷方式),但它应该能让你得到你想要的东西。

答案 1 :(得分:3)

首先,选择Route 69上的所有边缘:

edges = g.es.select(name="Route69")

然后迭代选定的边并收集顶点的端点:

vertices = set()
for edge in edges:
    vertices.update(edge.tuple)

这将为您提供一个集合,其中包含至少一个名为Route69的边缘上的所有顶点的顶点ID。如果您需要VertexSeq,只需执行以下操作:

vertices = g.vs[sorted(vertices)]