blob: 3a16aa3a29053393f826e10dc437cf1ec745ae9f [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from age import *
import psycopg2
import networkx as nx
from age.models import Vertex, Edge, Path
from .lib import *
def age_to_networkx(connection: psycopg2.connect,
graphName: str,
G: None | nx.DiGraph = None,
query: str | None = None
) -> nx.DiGraph:
"""
@params
---------------------
connection - (psycopg2.connect) Connection object
graphName - (str) Name of the graph
G - (networkx.DiGraph) Networkx directed Graph [optional]
query - (str) Cypher query [optional]
@returns
------------
Networkx directed Graph
"""
# Check if the age graph exists
checkIfGraphNameExistInAGE(connection, graphName)
# Create an empty directed graph
if G == None:
G = nx.DiGraph()
def addNodeToNetworkx(node):
"""Add Nodes in Networkx"""
G.add_node(node.id,
label=node.label,
properties=node.properties)
def addEdgeToNetworkx(edge):
"""Add Edge in Networkx"""
G.add_edge(edge.start_id,
edge.end_id,
label=edge.label,
properties=edge.properties)
def addPath(path):
"""Add Edge in Networkx"""
for x in path:
if (type(x) == Path):
addPath(x)
for x in path:
if (type(x) == Vertex):
addNodeToNetworkx(x)
for x in path:
if (type(x) == Edge):
addEdgeToNetworkx(x)
# Setting up connection to work with Graph
age.setUpAge(connection, graphName)
if (query == None):
addAllNodesIntoNetworkx(connection, graphName, G)
addAllEdgesIntoNetworkx(connection, graphName, G)
else:
with connection.cursor() as cursor:
cursor.execute(query)
rows = cursor.fetchall()
for row in rows:
for x in row:
if type(x) == Path:
addPath(x)
elif type(x) == Edge:
addEdgeToNetworkx(x)
elif type(x) == Vertex:
addNodeToNetworkx(x)
return G