Najlepsze praktyki dotyczące kwerend grafów według atrybutów krawędzi i węzłów w NetworkX

Korzystanie z NetworkX i nowości w bibliotece do zapytania o analizę sieci społecznościowych. Przez Query mam na myśli wybieranie / tworzenie podgrafów według atrybutów obu węzłów krawędzi, gdzie krawędzie tworzą ścieżkę, a węzły zawierają atrybuty. Wykres używa MultiDiGraph formularza

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

Zapytany o

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" 

Czy jest lepszy sposób na zapytanie? Czy jest to najlepsza praktyka tworzenia niestandardowych iteracji w celu tworzenia podgrafów?

Alternatywnie (i osobne pytanie) wykres można uprościć, ale nie używam poniższego wykresu, ponieważ obiekty typu „nienawiści” będą miały predyktory. Czy to ułatwiłoby zapytanie? Wydaje się, że łatwiej jest iterować po węzłach

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

Inne notatki:

Być możeadd_path dodaje identyfikator do utworzonej ścieżki?iGraph maładna funkcja zapytania g.vs.select()

questionAnswers(3)

yourAnswerToTheQuestion