|
@@ -6,9 +6,46 @@ import pandas as pd
|
|
|
from app.services.neo4j_driver import neo4j_driver
|
|
|
from app.core.graph.graph_operations import create_or_get_node, relationship_exists, get_node, connect_graph
|
|
|
import time
|
|
|
+from datetime import datetime
|
|
|
+from app.core.meta_data import get_formatted_time, translate_and_parse
|
|
|
+from app import db
|
|
|
+from sqlalchemy import text
|
|
|
|
|
|
logger = logging.getLogger("app")
|
|
|
|
|
|
+def serialize_neo4j_object(obj):
|
|
|
+ """
|
|
|
+ 将Neo4j对象转换为可JSON序列化的格式
|
|
|
+
|
|
|
+ Args:
|
|
|
+ obj: Neo4j节点或属性值
|
|
|
+
|
|
|
+ Returns:
|
|
|
+ 序列化后的对象
|
|
|
+ """
|
|
|
+ if hasattr(obj, 'year'): # DateTime对象
|
|
|
+ # 将Neo4j DateTime转换为字符串
|
|
|
+ return obj.strftime("%Y-%m-%d %H:%M:%S") if hasattr(obj, 'strftime') else str(obj)
|
|
|
+ elif hasattr(obj, '__dict__'): # 复杂对象
|
|
|
+ return str(obj)
|
|
|
+ else:
|
|
|
+ return obj
|
|
|
+
|
|
|
+def serialize_node_properties(node):
|
|
|
+ """
|
|
|
+ 将Neo4j节点属性序列化为可JSON化的字典
|
|
|
+
|
|
|
+ Args:
|
|
|
+ node: Neo4j节点对象
|
|
|
+
|
|
|
+ Returns:
|
|
|
+ dict: 序列化后的属性字典
|
|
|
+ """
|
|
|
+ properties = {}
|
|
|
+ for key, value in dict(node).items():
|
|
|
+ properties[key] = serialize_neo4j_object(value)
|
|
|
+ return properties
|
|
|
+
|
|
|
def get_formatted_time():
|
|
|
"""获取格式化的当前时间"""
|
|
|
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
|
|
@@ -313,7 +350,7 @@ def handle_id_resource(resource_id):
|
|
|
# 构建返回数据
|
|
|
logger.info(f"record: {record}")
|
|
|
|
|
|
- data_resource = dict(record["n"])
|
|
|
+ data_resource = serialize_node_properties(record["n"])
|
|
|
|
|
|
logger.info(f"data_resource: {data_resource}")
|
|
|
logger.info(f"describe field in node: {record['n'].get('describe')}")
|
|
@@ -358,7 +395,7 @@ def handle_id_resource(resource_id):
|
|
|
|
|
|
parsed_data = []
|
|
|
for meta_record in meta_result:
|
|
|
- meta = dict(meta_record["m"])
|
|
|
+ meta = serialize_node_properties(meta_record["m"])
|
|
|
meta_data = {
|
|
|
"id": meta_record["m"].id,
|
|
|
"name": meta.get("name"),
|
|
@@ -419,12 +456,12 @@ def id_resource_graph(resource_id):
|
|
|
|
|
|
for record in result:
|
|
|
# 处理源节点
|
|
|
- source_node = dict(record["n"])
|
|
|
+ source_node = serialize_node_properties(record["n"])
|
|
|
source_node["id"] = record["n"].id
|
|
|
nodes[source_node["id"]] = source_node
|
|
|
|
|
|
# 处理目标节点
|
|
|
- target_node = dict(record["m"])
|
|
|
+ target_node = serialize_node_properties(record["m"])
|
|
|
target_node["id"] = record["m"].id
|
|
|
nodes[target_node["id"]] = target_node
|
|
|
|
|
@@ -492,7 +529,7 @@ def resource_list(page, page_size, en_name_filter=None, name_filter=None,
|
|
|
# 格式化结果
|
|
|
resources = []
|
|
|
for record in result:
|
|
|
- node = dict(record["n"])
|
|
|
+ node = serialize_node_properties(record["n"])
|
|
|
node["id"] = record["n"].id
|
|
|
|
|
|
# 查询关联的标签
|
|
@@ -505,7 +542,7 @@ def resource_list(page, page_size, en_name_filter=None, name_filter=None,
|
|
|
tag_record = tag_result.single()
|
|
|
|
|
|
if tag_record:
|
|
|
- tag = dict(tag_record["t"])
|
|
|
+ tag = serialize_node_properties(tag_record["t"])
|
|
|
tag["id"] = tag_record["t"].id
|
|
|
node["tag_info"] = tag
|
|
|
|
|
@@ -581,7 +618,7 @@ def id_data_search_list(resource_id, page, page_size, en_name_filter=None,
|
|
|
# 格式化结果
|
|
|
metadata_list = []
|
|
|
for record in result:
|
|
|
- meta = dict(record["m"])
|
|
|
+ meta = serialize_node_properties(record["m"])
|
|
|
meta["id"] = record["m"].id
|
|
|
metadata_list.append(meta)
|
|
|
|
|
@@ -628,14 +665,14 @@ def resource_kinship_graph(resource_id, include_meta=True):
|
|
|
relationships = []
|
|
|
|
|
|
# 处理数据资源节点
|
|
|
- resource_node = dict(record["n"])
|
|
|
+ resource_node = serialize_node_properties(record["n"])
|
|
|
resource_node["id"] = record["n"].id
|
|
|
resource_node["labels"] = list(record["n"].labels)
|
|
|
nodes[resource_node["id"]] = resource_node
|
|
|
|
|
|
# 处理标签节点
|
|
|
if record["l"]:
|
|
|
- label_node = dict(record["l"])
|
|
|
+ label_node = serialize_node_properties(record["l"])
|
|
|
label_node["id"] = record["l"].id
|
|
|
label_node["labels"] = list(record["l"].labels)
|
|
|
nodes[label_node["id"]] = label_node
|
|
@@ -652,7 +689,7 @@ def resource_kinship_graph(resource_id, include_meta=True):
|
|
|
if include_meta and record["metadata"]:
|
|
|
for meta in record["metadata"]:
|
|
|
if meta: # 检查元数据节点是否存在
|
|
|
- meta_node = dict(meta)
|
|
|
+ meta_node = serialize_node_properties(meta)
|
|
|
meta_node["id"] = meta.id
|
|
|
meta_node["labels"] = list(meta.labels)
|
|
|
nodes[meta_node["id"]] = meta_node
|
|
@@ -712,7 +749,7 @@ def resource_impact_all_graph(resource_id, include_meta=True):
|
|
|
# 处理路径中的所有节点
|
|
|
for node in path.nodes:
|
|
|
if node.id not in nodes:
|
|
|
- node_dict = dict(node)
|
|
|
+ node_dict = serialize_node_properties(node)
|
|
|
node_dict["id"] = node.id
|
|
|
node_dict["labels"] = list(node.labels)
|
|
|
nodes[node.id] = node_dict
|
|
@@ -1185,7 +1222,7 @@ def model_resource_list(page, page_size, name_filter=None):
|
|
|
# 格式化结果
|
|
|
resources = []
|
|
|
for record in result:
|
|
|
- node = dict(record["n"])
|
|
|
+ node = serialize_node_properties(record["n"])
|
|
|
node["id"] = record["n"].id
|
|
|
resources.append(node)
|
|
|
|
|
@@ -1322,7 +1359,7 @@ def data_resource_edit(data):
|
|
|
session.run(create_resource_standard_cypher, resource_id=int(resource_id), standard_id=int(standard_id))
|
|
|
|
|
|
# 返回更新后的节点
|
|
|
- node_data = dict(updated_node["n"])
|
|
|
+ node_data = serialize_node_properties(updated_node["n"])
|
|
|
node_data["id"] = updated_node["n"].id
|
|
|
|
|
|
# 记录最终返回的describe字段
|
|
@@ -1361,7 +1398,7 @@ def handle_data_source(data_source):
|
|
|
existing_record = existing_result.single()
|
|
|
|
|
|
if existing_record:
|
|
|
- existing_data_source = dict(existing_record["ds"])
|
|
|
+ existing_data_source = serialize_node_properties(existing_record["ds"])
|
|
|
logger.info(f"根据名称找到现有数据源: {existing_data_source.get('en_name')}")
|
|
|
return existing_data_source.get("en_name")
|
|
|
else:
|