【发布时间】:2014-05-11 20:38:52
【问题描述】:
我需要将 DBPedia 图的一个子集加载到 iGraph 中,以便计算一些图统计信息(例如节点中心性,...)。我使用 Redlands libRDF python 库加载 DBPedia 三元组。每个节点都与一个 URI(唯一标识符)相关联。
我在将图表加载到 iGraph 时遇到了一些问题。我就是这样做的:
1) 读三行(主语、谓语、宾语)
2) 使用以下算法获取或创建顶点(带属性)
def add_or_find_vertex (self, g, uri):
try:
return g.vs.find(name=uri)
except (KeyError, ValueError):
g.add_vertex(name=uri)
return g.vs.find(name=uri)
subjVertex = self.add_or_find_vertex(self.g, subject)
objVertex = self.add_or_find_vertex(self.g, object)
self.g.add_edge(subjVertex, objVertex, uri=predicate)
问题是我的脚本很慢,我需要加载 25M 三元组。每个节点都是唯一的,但在三重文件中多次找到。因此,我需要在创建边缘之前执行查找。您能告诉我“查找”方法是否使用索引进行查找(哈希表,...)?顶点查找的复杂性是多少?你会怎么做?
非常感谢
【问题讨论】:
-
加载列表中的所有边并通过一次调用创建图形。
-
非常感谢@GaborCsardi。事实上,瓶颈是
add_edge()调用,我一次调用每个关系。相反,我们在 Python 列表中创建了一个边列表,并在最后用add_edges(list)刷新了该列表。现在,它超级快!