1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
# Copyright (C) 2011 by
# Aric Hagberg <hagberg@lanl.gov>
# Dan Schult <dschult@colgate.edu>
# Pieter Swart <swart@lanl.gov>
# All rights reserved.
# BSD license.
from copy import deepcopy
from itertools import count,repeat
import json
import networkx as nx
__author__ = """Aric Hagberg (hagberg@lanl.gov))"""
__all__ = ['adjacency_data', 'adjacency_graph']
def adjacency_data(G):
"""Return data in adjacency format that is suitable for JSON serialization
and use in Javascript documents.
Parameters
----------
G : NetworkX graph
Returns
-------
data : dict
A dictionary with node-link formatted data.
Examples
--------
>>> from networkx.readwrite import json_graph
>>> G = nx.Graph([(1,2)])
>>> data = json_graph.adjacency_data(G)
To serialize with json
>>> import json
>>> s = json.dumps(data)
Notes
-----
Graph, node, and link attributes are stored in this format but keys
for attributes must be strings if you want to serialize with JSON.
See Also
--------
adjacency_graph, node_link_data, tree_data
"""
data = {}
data['directed'] = G.is_directed()
data['multigraph'] = G.is_multigraph()
data['graph'] = list(G.graph.items())
data['nodes'] = []
data['adjacency'] = []
for n,nbrdict in G.adjacency_iter():
data['nodes'].append(dict(id=n, **G.node[n]))
adj = []
for nbr,d in nbrdict.items():
adj.append(dict(id=nbr, **d))
data['adjacency'].append(adj)
return data
def adjacency_graph(data, directed=False, multigraph=True):
"""Return graph from adjacency data format.
Parameters
----------
data : dict
Adjacency list formatted graph data
Returns
-------
G : NetworkX graph
A NetworkX graph object
directed : bool
If True, and direction not specified in data, return a directed graph.
multigraph : bool
If True, and multigraph not specified in data, return a multigraph.
Examples
--------
>>> from networkx.readwrite import json_graph
>>> G = nx.Graph([(1,2)])
>>> data = json_graph.adjacency_data(G)
>>> H = json_graph.adjacency_graph(data)
See Also
--------
adjacency_graph, node_link_data, tree_data
"""
multigraph = data.get('multigraph',multigraph)
directed = data.get('directed',directed)
if multigraph:
graph = nx.MultiGraph()
else:
graph = nx.Graph()
if directed:
graph = graph.to_directed()
graph.graph = dict(data.get('graph',[]))
mapping=[]
for d in data['nodes']:
node = d.pop('id')
mapping.append(node)
graph.add_node(node, attr_dict=d)
for i,d in enumerate(data['adjacency']):
source = mapping[i]
for tdata in d:
target=tdata.pop('id')
graph.add_edge(source,target,attr_dict=tdata)
return graph
|