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