from flask import Blueprint, request, jsonify from app import get_driver, neo4j_logger bp = Blueprint('nodes', __name__) @bp.route('/nodes', methods=['GET', 'POST']) def nodes(): if request.method == 'GET': return get_nodes() elif request.method == 'POST': return create_node() def get_nodes(): node_type = request.args.get('type') if not node_type: return jsonify({"error": "Node type is required"}), 400 filter_property = request.args.get('filter') driver = get_driver() try: with driver.session() as session: query = f"MATCH (n:{node_type}) RETURN n" neo4j_logger.info(f"Executing query: {query}") nodes = session.run(query) nodes_list = [ { 'id': record['n'].id, 'labels': list(record['n'].labels), **{key: value for key, value in record['n'].items()} } for record in nodes ] if filter_property: filtered_nodes_list = [] for node in nodes_list: if filter_property in node: filtered_nodes_list.append({filter_property: node[filter_property]}) return jsonify({"nodes": filtered_nodes_list}) return jsonify({"nodes": nodes_list}) except Exception as e: neo4j_logger.error(f"Error interacting with Neo4j: {e}") return jsonify({"error": "An error occurred while interacting with the database"}), 500 def create_node(): data = request.get_json() if not data: return jsonify({"error": "No data provided"}), 400 node_type = data.pop('type', None) if not node_type: return jsonify({"error": "Node type is required in JSON data"}), 400 properties = ', '.join([f'{key}: "${key}"' for key in data]) query = f"CREATE (n:{node_type} {{{properties}}}) RETURN n" driver = get_driver() try: with driver.session() as session: neo4j_logger.info(f"Executing query: {query} with data: {data}") result = session.run(query, **data) new_node = { 'id': result.single()['n'].id, 'labels': list(result.single()['n'].labels), **{key: value for key, value in result.single()['n'].items()} } return jsonify(new_node), 201 except Exception as e: neo4j_logger.error(f"Error interacting with Neo4j: {e}") return jsonify({"error": "An error occurred while interacting with the database"}), 500