我需要將DBPedia圖的一個子集加載到iGraph中,以便計算一些圖統計信息(例如節點中心性...)。我使用Redlands libRDF python庫加載DBPedia三元組。每個節點都與一個URI(唯一標識符)關聯。將非常大的RDF三元組加載到iGraph中 - >快速頂點查找?
我有一些麻煩加載圖形到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三元組。每個節點都是唯一的,但在三重文件中多次找到。因此我需要在創建邊緣之前執行查找。你能告訴我,如果「find」方法使用索引進行查找(Hashtable,...)嗎?頂點查找的複雜性是什麼?你會怎麼做?
非常感謝您
加載列表中的所有邊並通過一次調用創建圖。 –
非常感謝@GaborCsardi。事實上,瓶頸是'add_edge()'調用,我一次一個地調用每個關係。相反,我們在Python列表中創建了一個邊列表,並在末尾用'add_edges(list)'刷新了列表。現在,它超快! –