# 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