Bewährte Methoden zum Abfragen von Diagrammen nach Kanten- und Knotenattributen in NetworkX

Verwenden von NetworkX und Neu in der Bibliothek für eine Abfrage zur Analyse sozialer Netzwerke. Mit "Abfrage" meine ich das Auswählen / Erstellen von Untergraphen nach Attributen der beiden Kantenknoten, wobei die Kanten einen Pfad erstellen und die Knoten Attribute enthalten. Das Diagramm verwendet einen MultiDiGraph des Formulars

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

Abgefragt mit

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" 

Gibt es eine bessere Möglichkeit zum Abfragen? Oder ist es empfehlenswert, benutzerdefinierte Iterationen zu erstellen, um Untergraphen zu erstellen?

Alternativ (und mit einer separaten Frage) könnte das Diagramm vereinfacht werden, aber ich verwende das folgende Diagramm nicht, da die Objekte vom Typ "hasst" Vorgänger haben. Würde dies das Abfragen vereinfachen? Scheint einfacher, über Knoten zu iterieren

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

Weitere Hinweise:

Vielleichtadd_path fügt dem erstellten Pfad einen Bezeichner hinzu?iGraph hat einenette Abfragefunktion g.vs.select()

Antworten auf die Frage(3)

Ihre Antwort auf die Frage