Jon*_*ler 22 python igraph networkx
使用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" )
Run Code Online (Sandbox Code Playgroud)
查询
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"
Run Code Online (Sandbox Code Playgroud)
有更好的查询方式吗?或者,最好的做法是创建自定义迭代来创建子图?
或者(和一个单独的问题),图可以简化,但我没有使用下面的图,因为"讨厌"类型对象将有前驱.这会让查询变得更简单吗?似乎更容易迭代节点
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")
Run Code Online (Sandbox Code Playgroud)
其他说明:
add_path为创建的路径添加标识符?g.vs.select()Ari*_*ric 25
编写单行代码来制作具有特定属性的节点列表或生成器非常简单(此处显示的生成器)
import networkx as nx
G = nx.Graph()
G.add_node(1, label='one')
G.add_node(2, label='fish')
G.add_node(3, label='two')
G.add_node(4, label='fish')
# method 1
fish = (n for n in G if G.node[n]['label']=='fish')
# method 2
fish2 = (n for n,d in G.nodes(data=True) if d['label']=='fish')
print(list(fish))
print(list(fish2))
G.add_edge(1,2,color='red')
G.add_edge(2,3,color='blue')
red = ((u,v) for u,v,d in G.edges(data=True) if d['color']=='red')
print(list(red))
Run Code Online (Sandbox Code Playgroud)
如果您的图形很大且已修复并且您想要快速查找,则可以创建这样的属性的"反向字典",
labels = {}
for n, d in G.nodes(data=True):
l = d['label']
labels[l] = labels.get(l, [])
labels[l].append(n)
print labels
Run Code Online (Sandbox Code Playgroud)
unu*_*tbu 10
在@Aric的答案基础上,您可以找到这样的红色鱼:
red_fish = set(n for u,v,d in G.edges_iter(data=True)
if d['color']=='red'
for n in (u, v)
if G.node[n]['label']=='fish')
print(red_fish)
# set([2])
Run Code Online (Sandbox Code Playgroud)
为了根据边和节点的属性选择边,你可能想要做这样的事情,使用你的图,G2:
def select(G2, query):
'''Call the query for each edge, return list of matches'''
result = []
for u,v,d in G2.edges(data=True):
if query(u,v,d):
result.append([(u,v)])
return result
# Example query functions
# Each assumes that it receives two nodes (u,v) and
# the data (d) for an edge
def dog_feeling(u, v, d):
return (d['statementid'] == "3"
and G2.node[u]['type'] == "Dog"
or G2.node[u]['type'] == "Dog")
def any_feeling(u,v,d):
return (d['statementid'] == "3"
and G2.node[u]['type'] == "Feeling"
or G2.node[u]['type'] == "Feeling")
def cat_feeling(u,v,d):
return (G2.node[u]['type'] == "Cat"
or G2.node[v]['type'] == "Cat")
# Using the queries
print select(G2, query = dog_feeling)
print select(G2, query = any_feeling)
print select(G2, query = cat_feeling)
Run Code Online (Sandbox Code Playgroud)
这将迭代过程抽象为select()函数,您可以将查询编写为单独的可测试函数.
| 归档时间: |
|
| 查看次数: |
16808 次 |
| 最近记录: |