policymap/api/endpoints/person_network.py

65 lines
2.3 KiB
Python

# endpoints/person_network.py
from flask import Blueprint, jsonify
import neo4j
from neo4j import GraphDatabase
from app import get_driver, neo4j_logger
bp = Blueprint('network', __name__)
@bp.route('/person_network', methods=['GET'])
def person_network():
driver = get_driver()
try:
with driver.session() as session:
query = """
MATCH (p:Person)-[r]->(n)
RETURN p, r, n
"""
result = session.run(query)
nodes = {}
links = []
for record in result:
person_node = record['p']
relationship = record['r']
connected_node = record['n']
# Add Person node if not already added
person_id = person_node.id
if person_id not in nodes:
properties = {key: value for key, value in person_node.items()}
properties['id'] = person_id
properties['labels'] = list(person_node.labels) # Include labels separately
nodes[person_id] = {
**properties,
"group": 1 # Group for Person
}
# Add connected node if not already added
connected_id = connected_node.id
if connected_id not in nodes:
properties = {key: value for key, value in connected_node.items()}
properties['id'] = connected_id
properties['labels'] = list(connected_node.labels) # Include labels separately
nodes[connected_id] = {
**properties,
"group": 2 # Group for other nodes (e.g., Organization, Position)
}
# Add link
links.append({
"source": person_id,
"target": connected_id,
"type": relationship.type,
"rel_properties": {key: value for key, value in relationship.items()}
})
return jsonify({"nodes": list(nodes.values()), "links": links})
except Exception as e:
print(f"Error interacting with Neo4j: {e}")
return jsonify({"error": f"An error occurred while interacting with the database: {str(e)}"}), 500