当前位置: 首页 > 面试题库 >

在NetworkX中按边和节点属性查询图的最佳实践

魏澄邈
2023-03-14
问题内容

使用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"

有没有更好的查询方法?还是创建自定义迭代以创建子图的最佳实践?

另外(也有一个单独的问题),可以简化图,但是我不使用下面的图,因为“讨厌”类型的对象将具有前身。这会使查询更简单吗?似乎更容易遍历节点

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

问题答案:

以@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])

编写单行代码以创建具有特定属性的节点列表或生成器非常简单(此处显示了生成器)

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

如果您的图形很大且固定的,并且想要进行快速查找,则可以对这样的属性制作“反向字典”,

labels = {}
for n, d in G.nodes(data=True):
    l = d['label']
    labels[l] = labels.get(l, [])
    labels[l].append(n)
print labels


 类似资料:
  • 问题内容: 我有一个使用python创建的节点网络。我想在节点中存储信息,以便以后可以基于节点标签(节点名称)和存储信息的字段(例如节点属性)访问信息。我希望以这样的方式存储的信息可以是字符串或数字,例如if是一个节点: 然后我要保存两个或三个具有字符串的字段,如出生日期,出生 地点和出生 日期 。 我知道我可以使用属性字典字段…但是我似乎无法为特定字段访问它。如果有任何其他方式,我将不胜感激。

  • 如何在单个gremlin查询中合并两个顶点详细信息和边缘属性详细信息。 我有两个顶点: 使用Gremlin查询:g.v(2569472).out('\u label','WallPost')[0..1] 我正在获取UserPost顶点细节,我想在响应中添加UserVertex细节(即性别)和边缘属性细节(即EdgeMessage) 我试图将sql等价的innerjoin操作与sql2gremlin

  • 我试图将一些数字表示为具有连通分支的图的边。为此,我一直在使用python的networkX模块。 我的图是G,节点和边初始化如下: 一旦我添加以下行, 我得到了上面提到的错误。如果可能有用的话,所有节点都以9-15位数字进行编号。共有412个节点和422条边。 详细错误: 编辑:解决如下问题。有用信息:pos创建一个dict,其中包含每个节点的坐标。正在执行nx。draw(G,pos)创建pyl

  • 我想比较两个较小的有向python igraph图,包括边或节点上的所有属性及其值,以及边的方向。python igraph包中有这样的函数吗? 我看到了G1.isomorphic(G2)和相关的,但是它们似乎不适用于属性,也不适用于边缘的方向性 例子:

  • 我有一个修改密码查询的性能问题。给定是一个源节点,它与子节点有大量的传出关系。这些子节点都有一个键属性。现在的目标是在原点和子节点之间创建新节点,以便将共享相同密钥属性值的所有子节点分组。这个想法的情节可以在neo4j控制台上找到:http://console.neo4j.org/?id=vinntj 我将查询与sping-data-neo4j 2.2.2一起使用。RELEASE和neo4j 1.

  • 如果我使用随机几何图创建一个二部图G,其中节点在半径内连接。然后,我想确保所有节点都有特定的阶数(即只有一条或两条边)。我的主要目标是获取一个节点集(即节点类型a),并确保每个节点都有我设置的最大度。例如,如果一个阶数为4的take节点i,则删除节点i的随机边,直到其阶数为1。 我编写了以下代码,以便在生成边后在图形生成器中运行。它删除边,但直到所有节点的阶数都为1。 完整功能如下: 回复jare