blob: 03f150fe4afbdb3e6390cd9c91a78d70463fb177 [file] [log] [blame]
# Copyright (C) 2011-2013 by
# Aric Hagberg <hagberg@lanl.gov>
# Dan Schult <dschult@colgate.edu>
# Pieter Swart <swart@lanl.gov>
# All rights reserved.
# BSD license.
from itertools import count,repeat
import json
import networkx as nx
__author__ = """Aric Hagberg <hagberg@lanl.gov>"""
__all__ = ['node_link_data', 'node_link_graph']
def node_link_data(G):
"""Return data in node-link 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.node_link_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
--------
node_link_graph, adjacency_data, tree_data
"""
multigraph = G.is_multigraph()
mapping = dict(zip(G,count()))
data = {}
data['directed'] = G.is_directed()
data['multigraph'] = multigraph
data['graph'] = list(G.graph.items())
data['nodes'] = [ dict(id=n, **G.node[n]) for n in G ]
if multigraph:
data['links'] = [ dict(source=mapping[u], target=mapping[v], key=k, **d)
for u,v,k,d in G.edges(keys=True, data=True) ]
else:
data['links'] = [ dict(source=mapping[u], target=mapping[v], **d)
for u,v,d in G.edges(data=True) ]
return data
def node_link_graph(data, directed=False, multigraph=True):
"""Return graph from node-link data format.
Parameters
----------
data : dict
node-link formatted graph data
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.
Returns
-------
G : NetworkX graph
A NetworkX graph object
Examples
--------
>>> from networkx.readwrite import json_graph
>>> G = nx.Graph([(1,2)])
>>> data = json_graph.node_link_data(G)
>>> H = json_graph.node_link_graph(data)
See Also
--------
node_link_data, adjacency_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()
mapping=[]
graph.graph = dict(data.get('graph',[]))
c = count()
for d in data['nodes']:
node = d.get('id',next(c))
mapping.append(node)
nodedata = dict((str(k),v) for k,v in d.items() if k!='id')
graph.add_node(node, **nodedata)
for d in data['links']:
link_data = d.copy()
source = link_data.pop('source')
target = link_data.pop('target')
edgedata = dict((str(k),v) for k,v in d.items()
if k!='source' and k!='target')
graph.add_edge(mapping[source],mapping[target],**edgedata)
return graph