I have a network of nodes created using python networkx
. i want to store information in nodes such that i can access the information later based on the node label (the name of the node) and the field that in which the information has been stored (like node attributes). the information stored can be a string or a number I wish to do so in a manner such that if xyz
is a node:
then I want to save two or three fields having strings like the date of birth of xyz
dob=1185
, the place of birth of xyz
pob=usa
, and the day of birth of xyz
dayob=monday
.
I know that i can use G.add_node
has the attribute dictionary field in it...but I can't seem to access it for a particular field. if there is any other way i would appreciate it.
i then want to compare xyz
with other nodes in the networks having the same information in common. i.e. intersection of node xyz
with node abc
based on date of bith, place of birth and day of birth
e.g for if nodes xyz
and abc
have an edge print their respective dob
s, their pob
s and their dayob
s
NetworkX uses dicts to store the nodes and neighbors in a graph. So the reporting of nodes and edges for the base graph classes will not necessarily be consistent across versions and platforms.
nbunch. An nbunch is a single node, container of nodes or None (representing all nodes). It can be a list, set, graph, etc.. To filter an nbunch so that only nodes actually in G appear, use G.
In NetworkX, nodes can be any hashable object e.g., a text string, an image, an XML object, another Graph, a customized node object, etc. Python's None object is not allowed to be used as a node.
Due to its dependence on a pure-Python "dictionary of dictionary" data structure, NetworkX is a reasonably efficient, very scalable, highly portable framework for network and social network analysis.
As you say, it's just a matter of adding the attributes when adding the nodes to the graph
G.add_node('abc', dob=1185, pob='usa', dayob='monday')
or as a dictionary
G.add_node('abc', {'dob': 1185, 'pob': 'usa', 'dayob': 'monday'})
To access the attributes, just access them as you would with any dictionary
G.node['abc']['dob'] # 1185 G.node['abc']['pob'] # usa G.node['abc']['dayob'] # monday
You say you want to look at attributes for connected nodes. Here's a small example on how that could be accomplished.
for n1, n2 in G.edges_iter(): print G.node[n1]['dob'], G.node[n2]['dob'] print G.node[n1]['pob'], G.node[n2]['pob'] # Etc.
As of networkx 2.0, G.edges_iter() has been replaced with G.edges(). This also applies to nodes. We set data=True
to access attributes. The code is now:
for n1, n2 in list(G.edges(data=True)): print G.node[n1]['dob'], G.node[n2]['dob'] print G.node[n1]['pob'], G.node[n2]['pob'] # Etc.
NOTE: In networkx 2.4, G.node[]
has been replaced with G.nodes[]
.
Additionally, you don't have to just assign the attributes when the node is added. Even after it's been added you can still set them directly.
import networkx as nx G=nx.Graph() G.add_edge(1,2) #see comment below code for recent versions of networkx. G.nodes[1]['name'] = 'alpha' G.nodes[2]['name'] = 'omega' G.nodes[1]['name'] > 'alpha'
Note: For versions before 2.4, use G.node[]
instead of G.nodes[]
. See deprecation notes.
You can also use set_node_attributes
(documentation) which will let you set an attribute for multiple nodes at the same time:
edit
#use the next line if it's networkx version 1.x #nx.set_node_attributes(G, 'cost', {1:3.5, 2:56}) #use the next line if it's networkx version 2.x #nx.set_node_attributes(G, {1:3.5, 2:56}, 'cost') #or for something that works for 1.x or 2.x nx.set_node_attributes(G, values = {1:3.5, 2:56}, name='cost') G.node[1]['cost'] > 3.5
Similar approaches can be used to set edge attributes.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With