Cognee+neo4j 可视化知识图谱以及增强检索

一、cognee官网地址

Quickstart - Cognee Documentation里面有快速入门教程,如果有没有跑通的小伙伴可以参照我的文章哦!

1、安装必要的库,这里使用的是uv不清楚的小伙伴可以看我之前的文章,有关于uv的配置。

uv add cognee neo4j chromadb fastapi

2、LLM环境配置的问题具体可以参考官方示例,链接放下面了

LLM Providers - Cognee Documentation

二、配置neo4j

1、登录官网https://console-preview.neo4j.io/

登陆后创建实例

2、点击个人账户设置,创建一个API key,这个是你链接云端neo4j的凭证。注意保存

3、创建.env文件配置好,此处注意url如果链接失败要加ssc来强链接数据库。剩下的填对应的就好。

GRAPH_DATABASE_PROVIDER=neo4j
GRAPH_DATABASE_URL="neo4j+ssc:"
GRAPH_DATABASE_USERNAME="neo4j"
GRAPH_DATABASE_PASSWORD=""

4、使用方式

示例代码如下:

import os
# 【关键点 1】加载环境变量必须在最前面
from dotenv import load_dotenv
load_dotenv()

import asyncio
import signal
import logging
import uvicorn
import chromadb
import cognee
from cognee.api.client import app as cognee_app
from fastapi.middleware.cors import CORSMiddleware

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger("AzureCogneeApp")

# ==============================================================================
# CORS 配置
# ==============================================================================
if cognee_app:
    logger.info("🛡️ 正在配置 CORS...")
    cognee_app.add_middleware(
        CORSMiddleware,
        allow_origins=["*"],
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

ui_pid = None

def configure_env():
    """配置所有环境变量 (Azure + Neo4j)"""
    logger.info("正在配置环境变量...")
    
    # 1. Azure OpenAI 配置
    os.environ["LLM_PROVIDER"] = "azure"
    os.environ["LLM_MODEL"] = os.getenv("LLM_MODEL", "azure/gpt-4")
    os.environ["LLM_API_KEY"] = os.getenv("LLM_API_KEY")
    os.environ["LLM_API_BASE"] = os.getenv("LLM_ENDPOINT")
    os.environ["LLM_API_VERSION"] = os.getenv("LLM_API_VERSION")
    
    os.environ["AZURE_OPENAI_API_KEY"] = os.getenv("LLM_API_KEY")
    os.environ["AZURE_OPENAI_ENDPOINT"] = os.getenv("LLM_ENDPOINT")
    os.environ["OPENAI_API_VERSION"] = os.getenv("LLM_API_VERSION")

    os.environ["EMBEDDING_PROVIDER"] = "azure"
    os.environ["EMBEDDING_MODEL"] = os.getenv("EMBEDDING_MODEL")
    os.environ["EMBEDDING_API_KEY"] = os.getenv("EMBEDDING_API_KEY")
    os.environ["EMBEDDING_API_BASE"] = os.getenv("EMBEDDING_ENDPOINT")
    os.environ["EMBEDDING_API_VERSION"] = os.getenv("EMBEDDING_API_VERSION")

    # 2. Neo4j 配置 (Cognee 会自动读取这些标准名称)
    # 这里的逻辑是:如果 .env 里写了旧的变量名(NEO4J_...),这里手动映射给 Cognee 识别的名称(GRAPH_DATABASE_...)
    # 如果你已经按第一步修改了 .env,这段代码会直接读取生效
    if os.getenv("NEO4J_URL"):
        logger.info("🔌 检测到 Neo4j 配置,正在应用...")
        os.environ["GRAPH_DATABASE_PROVIDER"] = "neo4j"
        os.environ["GRAPH_DATABASE_URL"] = os.getenv("NEO4J_URL")
        os.environ["GRAPH_DATABASE_USERNAME"] = os.getenv("NEO4J_USERNAME", "neo4j")
        os.environ["GRAPH_DATABASE_PASSWORD"] = os.getenv("NEO4J_PASSWORD")
    
    logger.info(f"配置完成。图数据库提供商: {os.getenv('GRAPH_DATABASE_PROVIDER', 'Default (NetworkX)')}")

def pid_callback(pid: int):
    global ui_pid
    ui_pid = pid

async def start_api_server():
    logger.info("🚀 正在启动后端 API 服务器...")
    config = uvicorn.Config(cognee_app, host="0.0.0.0", port=8000, log_level="warning", reload=False)
    server = uvicorn.Server(config)
    await server.serve()

async def setup_chroma_db():
    logger.info("初始化 ChromaDB...")
    db_path = os.getenv("CHROMADB_PATH", "./chroma_db")
    os.makedirs(db_path, exist_ok=True)
    client = chromadb.PersistentClient(path=db_path)
    collection = client.get_or_create_collection(name="knowledge_graph")
    return collection

async def prepare_data():
    documents = [
        "鲁迅喜欢抽烟",
        "鲁迅擅长写文章",
        "鲁迅写过的文章有朝花夕拾",
        "鲁迅也叫周树人",
        "二蛋小时候打过鲁迅,是鲁迅最好的玩伴",
        "三蛋是二蛋的弟弟,经常被二蛋欺负",
        "三蛋的爸爸是二蛋的爸爸,他们的爸爸是一个木匠,喜欢做些小工具"
    ]

    logger.info("📚 开始准备数据...")
    
    # 清理旧数据 (注意:这会尝试清空连接的图数据库)
    await cognee.prune.prune_data()
    await cognee.prune.prune_system(metadata=True)

    logger.info(f"📥 添加文档...")
    for doc in documents:
        await cognee.add(doc)

    logger.info("🧠 正在构建知识图谱 (Cognify)...")
    try:
        await cognee.cognify()
        logger.info("✅ 知识图谱构建完成")
    except Exception as e:
        logger.error(f"❌ 构建图谱失败: {e}")
        raise e

    test_query = "鲁迅是谁?"
    logger.info(f"🔍 测试搜索: {test_query}")
    results = await cognee.search(test_query)
    for idx, res in enumerate(results, 1):
        logger.info(f"结果 {idx}: {str(res)[:100]}...")

async def main():
    # 1. 配置环境 (设置 os.environ,cognee 内部会自动读取)
    configure_env()
    
    # 2. 初始化 Chroma
    await setup_chroma_db()

    # 3. 执行数据流程
    try:
        await prepare_data()
    except Exception as e:
        logger.error("程序在数据准备阶段终止。")
        return

    # 4. 启动服务
    logger.info("⚡ 启动服务...")
    api_task = asyncio.create_task(start_api_server())
    await asyncio.sleep(3)

    logger.info("="*60)
    logger.info(f"🎉 数据应已写入云端 Neo4j!")
    logger.info(f"👉 请访问 https://console.neo4j.io 使用 Neo4j Browser 查看")
    logger.info(f"👉 后端 API: http://localhost:8000")
    logger.info("="*60)
    
    try:
        while True:
            await asyncio.sleep(1)
    except KeyboardInterrupt:
        logger.info("停止服务...")
        api_task.cancel()

if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        pass

这里注意!!

1.Cognee是前后端分离项目,如果通过api部署的话导入的包路径是:from cognee.api.client import app

运行上面的示例代码。成功示例:

5、可视化使用方式

注意数据库实例要是running状态

点击query或者explore可以可视化

query的可视化代码示例(查看节点)

MATCH (n) RETURN n LIMIT 50

查看实体关系示例代码与结果图

MATCH (source:Entity)-[r]->(target:Entity)
RETURN source, r, target
LIMIT 100

explore操作示例:

如果存入数据后没有显示可视化图谱,点击show me a graph即可.

可能存在的疑问

1、为什么我的知识图谱不显示内容,显示的是id?

解决办法:按照图示选择你想要让节点展示的内容即可。

一般都是text或者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值