有没有办法根据节点是否具有共享属性来形成节点之间的连接?

Is there a way to form connections between nodes based upon if they have shared attributes?

我的目标是编写一个程序,从一个未连接的节点网络开始,每个节点可能具有相同或不同的属性。然后,如果节点具有共享属性,则将形成一条边。到目前为止,我已经查看了网络包,似乎没有一种简单的方法可以实现这一点。如果有人对此有任何想法,我将不胜感激!

import networkx as nx
import matplotlib.pyplot as plt
import random
know_list = ["a", "b", "c", "d"]
G = nx.Graph()
for i in range(1,5):
    G.add_node(i, knowledge = know_list[i-1])

#nx.draw(G)
#plt.show()
knowledge=nx.get_node_attributes(G, 'knowledge')
print(knowledge)

G.add_node(5, awareness = random.choices(know_list, k=2))
awareness = nx.get_node_attributes(G, 'awareness')
print(awareness)`

#返回节点5的意识字典后的目标是将意识字典中的内容与知识​​字典进行比较(注意get_node_attributes returns一个节点为的字典know_list 中的键和元素作为项目)。如果感知字典中的元素与节点的知识属性相同,则在两者之间添加一条边。例如,假设随机选择给出了意识 = [a,b]。在这种情况下,节点 5 将与节点 1 和 2 形成连接,因为节点 1 具有 [a] 的知识,而节点 2 具有 [b] 的知识。但是,节点 5 不会与节点 3 或 4 形成连接,因为它们不是意识字典中包含的元素。我希望这能解决一些问题,如果它仍然令人困惑,请告诉我。

从您分享的图表开始:

know_list = ["a", "b", "c", "d"]
G = nx.Graph()
for i in range(1,5):
    G.add_node(i, knowledge = know_list[i-1])

nx.draw(G, with_labels=True, node_size=500, node_color='lightgreen')

您可以反转 knowledge 属性的 nx.get_node_attributes 返回的映射:

knowledge={j:i for i,j in nx.get_node_attributes(G, 'knowledge').items()}
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}

G.add_node(5, awareness = random.choices(know_list, k=2))
awareness = nx.get_node_attributes(G, 'awareness')
# {5: ['b', 'a']}

然后通过遍历 awareness,您可以通过使用 add_edge:

在内部列表中查找 knowledge 节点轻松添加新边
for k,v in awareness.items():
    for node in v:
        G.add_edge(k,knowledge[node])

nx.draw(G, with_labels=True, node_size=500, node_color='lightgreen')