package com.ruoyi.system.repository.neo4j;

import java.util.List;
import java.util.Optional;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.neo4j.repository.query.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.ruoyi.system.domain.neo4j.GraphNode;

/**
 * 知识图谱节点Repository
 *
 * @author jackeyhuang
 * @version 1.0.0
 * @date 2025-01-27
 */
@Repository
public interface GraphNodeRepository extends Neo4jRepository<GraphNode, Long>
{
    /**
     * 根据标签查找节点
     *
     * @param label 节点标签
     * @return 节点列表
     */
    List<GraphNode> findByLabel(String label);

    /**
     * 根据类型查找节点
     *
     * @param type 节点类型
     * @return 节点列表
     */
    List<GraphNode> findByType(String type);

    /**
     * 根据标签模糊查询
     *
     * @param label 节点标签
     * @return 节点列表
     */
    @Query("MATCH (n:Category) WHERE n.label CONTAINS $label RETURN n")
    List<GraphNode> findByLabelContaining(@Param("label") String label);

    /**
     * 查询所有节点及其关系
     *
     * @return 节点列表
     */
    @Query("MATCH (n:Category) RETURN n LIMIT 100")
    List<GraphNode> findAllWithRelationships();

    /**
     * 根据节点ID查询节点及其直接关系
     *
     * @param nodeId 节点ID
     * @return 节点
     */
    @Query("MATCH (n:Category) WHERE id(n) = $nodeId RETURN n")
    Optional<GraphNode> findByIdWithRelationships(@Param("nodeId") Long nodeId);

    /**
     * 查询两个节点之间的路径
     *
     * @param startNodeId 起始节点ID
     * @param endNodeId 结束节点ID
     * @param maxDepth 最大深度
     * @return 路径中的节点列表
     */
    @Query("MATCH path = shortestPath((start:KnowledgeNode)-[*1..$maxDepth]-(end:KnowledgeNode)) WHERE id(start) = $startNodeId AND id(end) = $endNodeId RETURN path")
    List<Object> findShortestPath(@Param("startNodeId") Long startNodeId, @Param("endNodeId") Long endNodeId, @Param("maxDepth") int maxDepth);
}
