Лучшие практики для запроса графиков по атрибутам ребер и узлов в 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()

Ответы на вопрос(3)

Ваш ответ на вопрос