NetworkX MultiDiGraph:向现有节点添加新属性

问题描述

所以我在尝试 MultiDiGraph 时遇到了这种情况,希望得到一些指导:

G = nx.MultiDiGraph()
setA= ['a','b','c','d','e','f']
G.add_nodes_from(setA,entity='typeA')

setB = ['a','x','y','z']
G.add_nodes_from(setB,entity='typeB')
print([node[0] for node in G.nodes(data='entity') if node[1]=='typeA'])

显然,这会导致覆盖节点 'a' 的 'entity' 属性并打印 '['b','f']'

因为我怀疑这是故意的 在 NetworkX 方面,对于我想要实现的目标,是否有任何可行的解决方法

非常感谢~

解决方法

我同意@Νίκος Γιαλίτσης。 One-Hot Encoding 是一种普遍可行的方式。此外,networkx.MlutiDiGraph 数据是一个节点(或边元组)绑定了一个属性 dict,也就是说,任何 python dict 格式都有意义!例如:

G = nx.MultiDiGraph()
setA = ['a','b','c','d','e','f']
G.add_nodes_from(setA,entity={"typeA":True,"typeB":False})

# or
entityA = {"typeA":True,"typeB":False}
G.add_nodes_from(setA,entity=entityA)

attr = {"entity": entityA}  # or simply assign entityA to attr.
G.add_nodes_from(setA,**attr)

G.add_nodes_from(setA,entity=[True,False],entity_label=["typeA","typeB"])
G.add_nodes_from(setA,entity=list(entityA.values()),entity_label=list(entityA.keys()))
……

那么问题仍然是如何获取每个节点类型的值。 (为每种类型设置二进制权重,并计算双向 Xor 可能是一个不错的选择。) PS:同样可以添加边缘属性。属性模式将展开为实体类型图的相邻矩阵。