64 lines
2.6 KiB
Python
64 lines
2.6 KiB
Python
from dotenv import load_dotenv, find_dotenv
|
|
load_dotenv(find_dotenv())
|
|
import os
|
|
import modules.logger_tool as logger
|
|
log_name = 'api_modules_database_tools_neo4j_http_tools'
|
|
log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback
|
|
logging = logger.get_logger(
|
|
name=log_name,
|
|
log_level=os.getenv("LOG_LEVEL", "DEBUG"),
|
|
log_path=log_dir,
|
|
log_file=log_name,
|
|
runtime=True,
|
|
log_format='default'
|
|
)
|
|
import requests
|
|
import base64
|
|
|
|
dev_mode = os.getenv('DEV_MODE', 'false')
|
|
|
|
def send_query(query, encoded_credentials=None, params=None, method='POST', database="system", endpoint="/tx/commit"):
|
|
if encoded_credentials is None:
|
|
logging.debug(f"Sending query to Neo4j: {query}")
|
|
credentials = f"{os.getenv('USER_NEO4J')}:{os.getenv('PASSWORD_NEO4J')}"
|
|
encoded_credentials = base64.b64encode(credentials.encode()).decode('utf-8')
|
|
logging.debug(f"Encoded credentials: {encoded_credentials}")
|
|
|
|
# Use HTTPS for production, HTTP for development
|
|
neo4j_url = f"{os.getenv('APP_GRAPH_URL')}/db/{database}{endpoint}"
|
|
logging.debug(f"URL: {neo4j_url}")
|
|
headers = {'Content-Type': 'application/json', 'Authorization': f'Basic {encoded_credentials}'}
|
|
logging.debug(f"Headers: {headers}")
|
|
data = {
|
|
"statements": [{
|
|
"statement": query,
|
|
"parameters": params or {}
|
|
}]
|
|
}
|
|
logging.debug(f"Data: {data}")
|
|
|
|
try:
|
|
logging.debug(f"Sending request to Neo4j...")
|
|
response = requests.request(method, neo4j_url, json=data, headers=headers)
|
|
response.raise_for_status() # Raise an HTTPError for bad responses
|
|
logging.debug(f"Response status code: {response.status_code}")
|
|
logging.debug(f"Response content: {response.content}")
|
|
return response.json()
|
|
except requests.exceptions.RequestException as e:
|
|
logging.error(f"Request to Neo4j failed: {e}")
|
|
raise
|
|
|
|
def create_node(node_type: str, node_data: dict, db=None):
|
|
query = f"CREATE (n:{node_type} $props) RETURN id(n)"
|
|
params = {"props": node_data}
|
|
response = send_query(query, database=db, params=params)
|
|
return response['results'][0]['data'][0]['meta'][0]['id']
|
|
|
|
def create_relationship(relationship_data: dict, db=None):
|
|
query = """
|
|
MATCH (a), (b) WHERE id(a) = $start_id AND id(b) = $end_id
|
|
CREATE (a)-[r:{rel_type}]->(b)
|
|
RETURN r
|
|
"""
|
|
params = {"start_id": relationship_data['start_node']['id'], "end_id": relationship_data['end_node']['id'], "rel_type": relationship_data['relationship_type'], "props": relationship_data.get('properties', {})}
|
|
return send_query("/db/neo4j/tx/commit", query, params, db=db) |