簡體   English   中英

NetworkX-從節點和屬性創建圖

[英]NetworkX - Create graph from node and attributes

我正在嘗試使用指定了節點和屬性的networkX制作網絡圖。 每個節點都是唯一的,但可以具有與其他節點匹配的屬性。 這些屬性將充當具有相同屬性的節點之間的邊緣。

輸入的示例(節點和屬性)

Name1   2-s2.0-84905590088, 2-s2.0-84901477890
Name2   2-s2.0-84941169876
Name3   2-s2.0-84958012773
Name4   2-s2.0-84960796474
Name5   2-s2.0-84945302996, 2-s2.0-84953281823, 2-s2.0-84944268402, 2-s2.0-84949478621, 2-s2.0-84947281259, 2-s2.0-84947759580, 2-s2.0-84945265895, 2-s2.0-84945247800, 2-s2.0-84946541351, 2-s2.0-84946051072, 2-s2.0-84942573284, 2-s2.0-84942280140, 2-s2.0-84937715425, 2-s2.0-84943751990, 2-s2.0-84957729558, 2-s2.0-84938844501, 2-s2.0-84934761065
Name6   2-s2.0-84908333808
Name7   2-s2.0-84925879816
Name8   2-s2.0-84940447040, 2-s2.0-84949534001
Name9   2-s2.0-84899915556, 2-s2.0-84922392381, 2-s2.0-84905079505, 2-s2.0-84940931972, 2-s2.0-84893682063, 2-s2.0-84954285577, 2-s2.0-84934934228, 2-s2.0-84926624187
Name10  2-s2.0-84907065810

因此Name5會有很多邊緣,這些邊緣連接到具有相同標識符的其他名稱。

我不確定這是否是networkX背后的正確想法,還是不確定您是否可以使用這種輸入來繪制圖形。 如果無法實現這種方式,我將如何格式化輸入以制作此圖? 我無法通過這種方式找到有關使用networkX的任何文檔或視頻。

您的要求是可能的。 我將您的數據存儲在一個csv文件中-請注意,在節點名稱后添加了,並刪除了所有空格。

Name1,2-s2.0-84905590088,2-s2.0-84901477890
Name2,2-s2.0-84941169876
Name3,2-s2.0-84958012773
Name4,2-s2.0-84960796474
Name5,2-s2.0-84945302996,2-s2.0-84953281823,2-s2.0-84944268402,2-s2.0-84949478621,2-s2.0-84947281259,2-s2.0-84947759580,2-s2.0-84945265895,2-s2.0-84945247800,2-s2.0-84946541351,2-s2.0-84946051072,2-s2.0-84942573284,2-s2.0-84942280140,2-s2.0-84937715425,2-s2.0-84943751990,2-s2.0-84957729558,2-s2.0-84938844501,2-s2.0-84934761065
Name6,2-s2.0-84908333808
Name7,2-s2.0-84925879816
Name8,2-s2.0-84940447040,2-s2.0-84949534001
Name9,2-s2.0-84899915556,2-s2.0-84922392381,2-s2.0-84905079505,2-s2.0-84940931972,2-s2.0-84893682063,2-s2.0-84954285577,2-s2.0-84934934228,2-s2.0-84926624187
Name10,2-s2.0-84907065810

一項觀察:您說Name5會有很多優勢,但是其屬性是唯一的。 而且,當我使用您的數據運行代碼時,所有屬性都是唯一的,因此圖中沒有邊。

我對您的數據進行了修改,以便僅使用每個屬性的前12個字符(我使用new_attributes = [x[:12] for x in new_attributes]這一行來表示new_attributes = [x[:12] for x in new_attributes] )。 這樣我就得到了一些匹配的屬性。

現在的代碼:

import networkx as nx
import csv

G = nx.Graph()

with open('data.csv') as csvfile:
        csv_reader = csv.reader(csvfile, delimiter=',')
        for row in csv_reader:

            new_node = row[0]  # first element in row
            new_attributes = row[1:]  # whole row except the first element
            new_attributes = [x[:12] for x in new_attributes]  # remove this for your data!
            # add the node and its attributes to the graph
            G.add_node(new_node, my_attributes=new_attributes)  # attributes are stored as a list

            # add edges based on existing nodes
            for node, attrs in G.nodes(data=True):
                # skip node we just added
                if node != new_node:
                    for attr in attrs['my_attributes']:
                        # check if any of the attributes for `node` are also in the `new_attributes` list
                        if attr in new_attributes:
                            G.add_edge(node, new_node)

for edge in G.edges():
    print('EDGE:', edge, '| COMMON ATTRIBUTES:', set(G.node[edge[0]]['my_attributes']) & set(G.node[edge[1]]['my_attributes']))

對於每個csv行,我將一個節點(及其屬性)添加到圖形中,並基於圖形中的當前節點(及其屬性)添加邊緣。 請注意,節點屬性存儲在列表中,並且可以使用my_attributes鍵進行訪問。 最后,我還將打印具有特定邊緣中節點匹配屬性的邊緣(我使用set&來獲取兩個屬性列表的交集)。

tweeked數據的輸出:

EDGE: ('Name5', 'Name9') | COMMON ATTRIBUTES: {'2-s2.0-84934'}
EDGE: ('Name5', 'Name8') | COMMON ATTRIBUTES: {'2-s2.0-84949'}
EDGE: ('Name8', 'Name9') | COMMON ATTRIBUTES: {'2-s2.0-84940'}
EDGE: ('Name1', 'Name9') | COMMON ATTRIBUTES: {'2-s2.0-84905'}

最后一點:如果需要在兩個節點之間有多個邊,請使用MultiGraph

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM