83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
# endpoints/relationships.py
|
|
from flask import Blueprint, request, jsonify
|
|
from app import get_driver, neo4j_logger
|
|
|
|
bp = Blueprint('relationships', __name__)
|
|
|
|
@bp.route('/relationships', methods=['GET', 'POST'])
|
|
def relationships():
|
|
if request.method == 'GET':
|
|
relationship_type = request.args.get('type')
|
|
|
|
if not relationship_type:
|
|
return list_relationship_types()
|
|
else:
|
|
return list_relationships_by_type(relationship_type)
|
|
elif request.method == 'POST':
|
|
return create_relationship()
|
|
|
|
def list_relationship_types():
|
|
driver = get_driver()
|
|
with driver.session() as session:
|
|
query = "CALL db.relationshipTypes()"
|
|
neo4j_logger.info(f"Executing query: {query}")
|
|
result = session.run(query)
|
|
|
|
# Convert the result to a list of dictionaries
|
|
relationship_types_list = [record['relationshipType'] for record in result]
|
|
|
|
return jsonify({"relationship_types": relationship_types_list})
|
|
|
|
def list_relationships_by_type(relationship_type):
|
|
driver = get_driver()
|
|
with driver.session() as session:
|
|
query = f"MATCH ()-[r:{relationship_type}]->() RETURN r"
|
|
neo4j_logger.info(f"Executing query: {query}")
|
|
relationships = session.run(query)
|
|
|
|
# Convert the relationships to a list of dictionaries
|
|
relationships_list = [
|
|
{
|
|
'id': record['r'].id,
|
|
'type': relationship_type,
|
|
**{key: value for key, value in record['r'].items()}
|
|
}
|
|
for record in relationships
|
|
]
|
|
|
|
return jsonify({"relationships": relationships_list})
|
|
|
|
def create_relationship():
|
|
data = request.get_json()
|
|
if not data:
|
|
return jsonify({"error": "No data provided"}), 400
|
|
|
|
required_keys = ['start_node_id', 'end_node_id', 'type']
|
|
for key in required_keys:
|
|
if key not in data:
|
|
return jsonify({"error": f"Missing required field: {key}"}), 400
|
|
|
|
start_node_id = data['start_node_id']
|
|
end_node_id = data['end_node_id']
|
|
relationship_type = data['type']
|
|
|
|
# Optional properties
|
|
properties = ', '.join([f'{key}: "${key}"' for key in data if key not in required_keys])
|
|
property_clause = f"{{{properties}}}" if properties else ""
|
|
|
|
query = f"MATCH (a) WHERE id(a)={start_node_id} MATCH (b) WHERE id(b)={end_node_id} CREATE (a)-[r:{relationship_type}{property_clause}]->(b) RETURN r"
|
|
|
|
driver = get_driver()
|
|
with driver.session() as session:
|
|
neo4j_logger.info(f"Executing query: {query} with data: {data}")
|
|
result = session.run(query, **data)
|
|
|
|
# Convert the created relationship to a dictionary
|
|
new_relationship = {
|
|
'id': result.single()['r'].id,
|
|
'type': relationship_type,
|
|
**{key: value for key, value in result.single()['r'].items()}
|
|
}
|
|
|
|
return jsonify(new_relationship), 201
|