使用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"
有更好的查询方式吗?或者最佳实践是创建自定义迭代器来创建子图吗?
另外(也是一个独立的问题),图可以简化,但我没有使用下面的图,因为“hates”类型的对象将具有前置项。这会使查询变得更简单吗?在节点上进行迭代似乎更容易。
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()