77 lines
2.5 KiB
Python
77 lines
2.5 KiB
Python
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
|