Mejores prácticas para consultar gráficos por atributos de borde y nodo en NetworkX

Uso de NetworkX, y nuevo en la biblioteca, para una consulta de análisis de redes sociales. Por consulta, me refiero a seleccionar / crear subgrafos por atributos de los nodos de ambos bordes donde los bordes crean una ruta y los nodos contienen atributos. El gráfico está utilizando un MultiDiGraph de la forma

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"  )

Consultado con

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" 

¿Hay una mejor manera de consultar? ¿O es la mejor práctica crear iteraciones personalizadas para crear subgrafos?

Alternativamente (y una pregunta separada), el Gráfico podría simplificarse, pero no estoy usando el gráfico siguiente porque los objetos del tipo "odia" tendrán predecesores. ¿Esto haría la consulta más simple? Parece más fácil iterar sobre los nodos

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")

Otras notas:

Quizásadd_path añade un identificador a la ruta creada?iGraph tiene uncaracterística de consulta agradable g.vs.select()

Respuestas a la pregunta(3)

Su respuesta a la pregunta