Prechádzať zdrojové kódy

修复数据模型更新失败的问题

maxiaolong 3 mesiacov pred
rodič
commit
2cab8db8e0

+ 1 - 1
app/api/meta_data/routes.py

@@ -8,7 +8,7 @@ import os
 from minio import Minio
 from minio.error import S3Error
 from app.services.neo4j_driver import neo4j_driver
-from app.services.package_function import create_or_get_node, relationship_exists
+from app.core.graph.graph_operations import create_or_get_node, relationship_exists
 from app.core.meta_data import (
     translate_and_parse, 
     get_formatted_time, 

+ 1 - 1
app/core/data_metric/metric_interface.py

@@ -15,7 +15,7 @@ from app.core.common import delete_relationships, update_or_create_node, get_nod
 from app.core.meta_data import get_formatted_time
 from app.core.graph.graph_operations import connect_graph
 from app.core.data_resource.resource import get_node_by_id
-from app.services.package_function import get_node, create_or_get_node, relationship_exists
+from app.core.graph.graph_operations import get_node, create_or_get_node, relationship_exists
 
 # 使用应用日志
 logger = logging.getLogger("app")

+ 2 - 2
app/core/data_model/model.py

@@ -17,8 +17,8 @@ from py2neo import Relationship
 import logging
 import json
 
-from app.services.package_function import create_or_get_node, relationship_exists, get_node
-from app.core.graph.graph_operations import connect_graph
+from app.core.graph.graph_operations import relationship_exists
+from app.core.graph.graph_operations import connect_graph,create_or_get_node,get_node
 from app.services.neo4j_driver import neo4j_driver
 from app.core.meta_data import get_formatted_time, handle_id_unstructured
 from app.core.common import delete_relationships, update_or_create_node, get_node_by_id_no_label

+ 1 - 1
app/core/data_resource/resource.py

@@ -4,7 +4,7 @@ import logging
 from py2neo import Relationship
 import pandas as pd
 from app.services.neo4j_driver import neo4j_driver
-from app.services.package_function import create_or_get_node, relationship_exists, get_node
+from app.core.graph.graph_operations import create_or_get_node, relationship_exists, get_node
 import time
 
 logger = logging.getLogger("app")

+ 6 - 2
app/core/graph/__init__.py

@@ -8,7 +8,9 @@ from app.core.graph.graph_operations import (
     create_or_get_node,
     create_relationship,
     get_subgraph,
-    execute_cypher_query
+    execute_cypher_query,
+    get_node,
+    relationship_exists
 )
 
 __all__ = [
@@ -16,5 +18,7 @@ __all__ = [
     'create_or_get_node',
     'create_relationship',
     'get_subgraph',
-    'execute_cypher_query'
+    'execute_cypher_query',
+    'get_node',
+    'relationship_exists'
 ] 

+ 91 - 1
app/core/graph/graph_operations.py

@@ -273,4 +273,94 @@ def execute_cypher_query(cypher, params=None):
             return data
     except Exception as e:
         logger.error(f"Error executing Cypher query: {str(e)}")
-        raise e 
+        raise e
+
+def get_node(label, **properties):
+    """
+    查询具有给定标签和属性的节点
+    
+    Args:
+        label (str): Neo4j节点标签
+        **properties: 作为关键字参数的节点属性
+        
+    Returns:
+        节点对象,如果不存在则返回None
+    """
+    try:
+        with connect_graph().session() as session:
+            # 构建查询条件
+            conditions = []
+            params = {}
+            
+            # 处理ID参数
+            if 'id' in properties:
+                conditions.append("id(n) = $node_id")
+                params['node_id'] = properties['id']
+                # 移除id属性,避免在后续属性匹配中重复
+                properties_copy = properties.copy()
+                properties_copy.pop('id')
+                properties = properties_copy
+            
+            # 处理其他属性
+            for key, value in properties.items():
+                conditions.append(f"n.{key} = ${key}")
+                params[key] = value
+            
+            # 构建查询语句
+            where_clause = " AND ".join(conditions) if conditions else "TRUE"
+            query = f"""
+            MATCH (n:{label})
+            WHERE {where_clause}
+            RETURN n
+            LIMIT 1
+            """
+            
+            # 执行查询
+            result = session.run(query, **params).single()
+            return result["n"] if result else None
+            
+    except Exception as e:
+        logger.error(f"Error in get_node: {str(e)}")
+        return None
+
+def relationship_exists(start_node, rel_type, end_node, **properties):
+    """
+    检查两个节点之间是否存在指定类型和属性的关系
+    
+    Args:
+        start_node: 起始节点
+        rel_type: 关系类型
+        end_node: 结束节点
+        **properties: 关系的属性
+        
+    Returns:
+        bool: 是否存在关系
+    """
+    try:
+        with connect_graph().session() as session:
+            # 构建查询语句
+            query = """
+            MATCH (a)-[r:%s]->(b)
+            WHERE id(a) = $start_id AND id(b) = $end_id
+            """ % rel_type
+            
+            # 添加属性条件
+            if properties:
+                conditions = []
+                for key, value in properties.items():
+                    conditions.append(f"r.{key} = ${key}")
+                query += " AND " + " AND ".join(conditions)
+            
+            query += "\nRETURN count(r) > 0 as exists"
+            
+            # 执行查询
+            params = {
+                'start_id': start_node.identity,
+                'end_id': end_node.identity,
+                **properties
+            }
+            result = session.run(query, **params).single()
+            return result and result["exists"]
+    except Exception as e:
+        logger.error(f"Error in relationship_exists: {str(e)}")
+        return False 

+ 12 - 13
app/services/package_function.py

@@ -1,8 +1,10 @@
 # 封装mysql执行函数、创建节点函数
 from flask_sqlalchemy import SQLAlchemy
-from app.core.graph.graph_operations import connect_graph
+from app.core.graph.graph_operations import connect_graph, get_node as graph_get_node
 from py2neo import Node, RelationshipMatch
+import logging
 
+logger = logging.getLogger(__name__)
 db = SQLAlchemy()
 
 def execute_sql(cur, sql, params):
@@ -28,29 +30,26 @@ def sql_execute_result(sql):
 
 
 # 创建或获取节点
+""" 
 def create_or_get_node(label, **properties):
-    node = connect_graph.nodes.match(label, **properties).first()
+    node = connect_graph().nodes.match(label, **properties).first()
     if node is None:
         node = Node(label, **properties)
-        connect_graph.create(node)
-    return node
+        connect_graph().create(node)
+    return node 
+""" 
+
 
 
 # 查询是否存在节点
+""" 
 def get_node(label, **properties):
     node = connect_graph.nodes.match(label, **properties).first()
     # 如果没有找到匹配的节点,node 将会是 None
-    return node
+    return node 
+"""
 
 
-# 查询是否存在关系
-def relationship_exists(start_node, rel_type, end_node, **properties):
-    matcher = connect_graph.match(nodes=[start_node, end_node], r_type=rel_type)
-    # 如果需要匹配关系的属性
-    if properties:
-        matcher = matcher.where(**properties)
-    result = matcher.first()
-    return result is not None
 
 
 # 关系权重生成