Лучшие практики для запроса графиков по атрибутам ребер и узлов в NetworkX
Использование NetworkX и новинка в библиотеке для запроса анализа социальной сети. Под Запросом я подразумеваю выбор / создание подграфов по атрибутам обоих узлов ребер, где ребра создают путь, а узлы содержат атрибуты. График использует MultiDiGraph вида
G2 = nx.MultiDiGraph()
G2.add_node( "UserA", { "type" :"Cat" } )
G2.add_node( "UserB", { "type" :"Dog" } )
G2.add_node( "UserC", { "type" :"Mouse" } )
G2.add_node( "Likes", { "type" :"Feeling" } )
G2.add_node( "Hates", { "type" :"Feeling" } )
G2.add_edge( "UserA", 'Hates' , statementid="1" )
G2.add_edge( "Hates", 'UserB' , statementid="1" )
G2.add_edge( "UserC", 'Hates' , statementid="2" )
G2.add_edge( "Hates", 'UserA' , statementid="2" )
G2.add_edge( "UserB", 'Hates' , statementid="3" )
G2.add_edge( "Hates", 'UserA' , statementid="3" )
G2.add_edge( "UserC", 'Likes' , statementid="3" )
G2.add_edge( "Likes", 'UserB' , statementid="3" )
Запрашивается с
for node,data in G2.nodes_iter(data=True):
if ( data['type'] == "Cat" ):
# get all edges out from these nodes
#then recursively follow using a filter for a specific statement_id
#or get all edges with a specific statement id
# look for with a node attribute of "cat"
Есть ли лучший способ сделать запрос? Или лучше всего создавать пользовательские итерации для создания подграфов?
В качестве альтернативы (и отдельного вопроса) график может быть упрощен, но я не использую приведенный ниже график, потому что объекты типа «ненавидят» будут иметь предшественников. Это сделает запрос проще? Кажется, легче перебирать узлы
G3 = nx.MultiDiGraph()
G3.add_node( "UserA", { "type" :"Cat" } )
G3.add_node( "UserB", { "type" :"Dog" } )
G3.add_edge( "UserA", 'UserB' , statementid="1" , label="hates")
G3.add_edge( "UserA", 'UserB' , statementid="2" , label="hates")
Другие заметки:
возможноadd_path
добавляет идентификатор к созданному пути?у iGraph естьхорошая функция запроса g.vs.select()