Source code for neonx.geoff


# -*- coding: utf-8 -*-

import json

import networkx as nx


__all__ = ['get_geoff']


def get_node(node_name, properties, encoder):
    """converts a NetworkX node into a Geoff string.

    :param node_name: the ID of a NetworkX node
    :param properties: a dictionary of node attributes
    :param encoder: an instance of a JSON encoder (e.g.
        `json.JSONEncoder`)
    :rtype: A Geoff string
    """
    if properties:
        return '({0} {1})'.format(node_name,
                                  encoder.encode(properties))
    else:
        return '({0})'.format(node_name)


def get_edge(from_node, to_node, properties, edge_relationship_name, encoder):
    """converts a NetworkX edge into a Geoff string.

    :param from_node: the ID of a NetworkX source node
    :param to_node: the ID of a NetworkX target node
    :param properties: a dictionary of edge attributes
    :param edge_relationship_name: string that describes the
        relationship between the two nodes
    :param encoder: an instance of a JSON encoder (e.g.
        `json.JSONEncoder`)
    :rtype: A Geoff string
    """
    edge_string = None
    if properties:
        args = [from_node, edge_relationship_name,
                encoder.encode(properties), to_node]
        edge_string = '({0})-[:{1} {2}]->({3})'.format(*args)
    else:
        args = [from_node, edge_relationship_name, to_node]
        edge_string = '({0})-[:{1}]->({2})'.format(*args)

    return edge_string


[docs]def get_geoff(graph, edge_rel_name, encoder=None): """ Get the `graph` as Geoff string. The edges between the nodes have relationship name `edge_rel_name`. The code below shows a simple example:: from neonx import get_geoff # create a graph import networkx as nx G = nx.Graph() G.add_nodes_from([1, 2, 3]) G.add_edge(1, 2) G.add_edge(2, 3) # get the geoff string geoff_string = get_geoff(G, 'LINKS_TO') If the properties are not json encodable, please pass a custom JSON encoder class. See `JSONEncoder <http://docs.python.org/2/library/json.html#json.JSONEncoder/>`_. :param graph: A NetworkX Graph or a DiGraph :param edge_rel_name: Relationship name between the nodes :param optional encoder: JSONEncoder object. Defaults to JSONEncoder. :rtype: A Geoff string """ if encoder is None: encoder = json.JSONEncoder() is_digraph = isinstance(graph, nx.DiGraph) lines = [] lapp = lines.append for node_name, properties in graph.nodes(data=True): lapp(get_node(node_name, properties, encoder)) for from_node, to_node, properties in graph.edges(data=True): lapp(get_edge(from_node, to_node, properties, edge_rel_name, encoder)) if not is_digraph: lapp(get_edge(to_node, from_node, properties, edge_rel_name, encoder)) return '\n'.join(lines)