简单使用FalkorDB和Neo4j图数据库

简单使用FalkorDB图数据库

1 介绍

FalkorDB 是一个通过稀疏矩阵和线性代数实现高性能查询的图数据库,专注于为LLM和企业级GraphRAG应用提供超低延迟的知识图谱服务。对中文的支持不太好。

复制代码
# 官网 
https://www.falkordb.com/

# 官方文档
https://docs.falkordb.com/

# Github地址
https://github.com/falkordb/falkordb

# cypher语言地址
https://docs.falkordb.com/cypher/

Neo4j 是一个图数据库管理系统,专为存储、查询和处理高度关联的数据而设计,性能相对较差,但是比较成熟、文文档齐全。中文支持很好。

复制代码
# Python参考文档
https://neo4j.com/docs/python-manual/current/

# cypher语法
https://neo4j.com/docs/getting-started/cypher/

# Github官网
https://github.com/neo4j/neo4j

# 语言选择
https://neo4j.com/docs/create-applications/

2 Cypher语法

2.1 Cypher语法核心概念(对应 SQL)

图概念 Cypher 关键字 类似 SQL
节点(实体) () 表中的行
关系(连接) -[]-><-[]- 外键连接
属性(数据) {key: value} 列的值
标签(分类) :Label 表名
类型(关系) :TYPE 关系类型

1. 节点标签(Node Labels)

  • 用于分类节点,类似于 SQL 中的表名

  • 语法: :Label

  • 示例:

    cypher 复制代码
    (:Person)          -- 一个具有 Person 标签的节点
    (:Person:Customer) -- 具有多个标签的节点
    (p:Person)         -- 别名为 p 的 Person 节点

2. 关系类型(Relationship Types)

  • 描述节点间连接的性质

  • 语法: :TYPE

  • 示例:

    cypher 复制代码
    -[:KNOWS]->         -- 一个 KNOWS 类型的关系
    -[:WORKS_FOR]->     -- WORKS_FOR 类型的关系
    -[:LIKES {score: 5}]-> -- 带属性的关系

2.2 创建例子

1 中文

创建节点

cypher 复制代码
// 创建师徒节点
CREATE (唐僧:角色 {名称: '唐僧', 类型: '师父', 别名: ['唐三藏', '玄奘'], 特点: '金蝉子转世'})
CREATE (悟空:角色 {名称: '孙悟空', 类型: '徒弟', 别名: ['齐天大圣', '美猴王'], 特点: '石猴出身'})
CREATE (八戒:角色 {名称: '猪八戒', 类型: '徒弟', 别名: ['天蓬元帅'], 特点: '好吃懒做'})
CREATE (沙僧:角色 {名称: '沙僧', 类型: '徒弟', 别名: ['沙和尚', '卷帘大将'], 特点: '忠厚老实'})
CREATE (白龙马:角色 {名称: '白龙马', 类型: '徒弟', 别名: ['小白龙'], 特点: '西海龙王三太子'})

创建关系

cypher 复制代码
// 建立师徒关系
MATCH (唐僧:角色 {名称: '唐僧'})
MATCH (悟空:角色 {名称: '孙悟空'})
MATCH (八戒:角色 {名称: '猪八戒'})
MATCH (沙僧:角色 {名称: '沙僧'})
MATCH (白龙马:角色 {名称: '白龙马'})

// 师徒关系
CREATE (唐僧)-[:师徒关系 {关系: '师父', 开始时间: '贞观十三年'}]->(悟空)
CREATE (唐僧)-[:师徒关系 {关系: '师父', 开始时间: '高老庄'}]->(八戒)
CREATE (唐僧)-[:师徒关系 {关系: '师父', 开始时间: '流沙河'}]->(沙僧)
CREATE (唐僧)-[:师徒关系 {关系: '师父', 开始时间: '鹰愁涧'}]->(白龙马)

// 师兄弟关系
CREATE (悟空)-[:师兄弟 {排序: 1, 称谓: '大师兄'}]->(八戒)
CREATE (悟空)-[:师兄弟 {排序: 1, 称谓: '大师兄'}]->(沙僧)
CREATE (八戒)-[:师兄弟 {排序: 2, 称谓: '二师兄'}]->(沙僧)

查询数据

cypher 复制代码
MATCH (唐僧:角色 {名称: '唐僧'})-[:师徒关系]->(徒弟)
RETURN 唐僧.名称 as 师父, COLLECT(徒弟.名称) as 徒弟们

2 英文

创建节点

cypher 复制代码
CREATE (TangSeng:Character {name: '唐僧', type: '师父', alias: ['唐三藏', '玄奘'], traits: '金蝉子转世'})
CREATE (WuKong:Character {name: '孙悟空', type: '徒弟', alias: ['齐天大圣', '美猴王'], traits: '石猴出身'})
CREATE (BaJie:Character {name: '猪八戒', type: '徒弟', alias: ['天蓬元帅'], traits: '好吃懒做'})
CREATE (ShaSeng:Character {name: '沙僧', type: '徒弟', alias: ['沙和尚', '卷帘大将'], traits: '忠厚老实'})
CREATE (BaiLongMa:Character {name: '白龙马', type: '徒弟', alias: ['小白龙'], traits: '西海龙王三太子'})

创建关系

cypher 复制代码
// Create master-disciple relationships
MATCH (TangSeng:Character {name: '唐僧'})
MATCH (WuKong:Character {name: '孙悟空'})
MATCH (BaJie:Character {name: '猪八戒'})
MATCH (ShaSeng:Character {name: '沙僧'})
MATCH (BaiLongMa:Character {name: '白龙马'})

// Master-disciple relationships
CREATE (TangSeng)-[:MASTER_DISCIPLE {relationship: '师父', startTime: '贞观十三年'}]->(WuKong)
CREATE (TangSeng)-[:MASTER_DISCIPLE {relationship: '师父', startTime: '高老庄'}]->(BaJie)
CREATE (TangSeng)-[:MASTER_DISCIPLE {relationship: '师父', startTime: '流沙河'}]->(ShaSeng)
CREATE (TangSeng)-[:MASTER_DISCIPLE {relationship: '师父', startTime: '鹰愁涧'}]->(BaiLongMa)

// Senior-junior relationships among disciples
CREATE (WuKong)-[:SENIOR_JUNIOR {ranking: 1, title: '大师兄'}]->(BaJie)
CREATE (WuKong)-[:SENIOR_JUNIOR {ranking: 1, title: '大师兄'}]->(ShaSeng)
CREATE (BaJie)-[:SENIOR_JUNIOR {ranking: 2, title: '二师兄'}]->(ShaSeng)

查询数据

cypher 复制代码
MATCH (TangSeng:Character {name: '唐僧'})-[:MASTER_DISCIPLE]->(disciple)
RETURN TangSeng.name as Master, COLLECT(disciple.name) as Apprentices

2 FalkorDB使用

2.1 Docker安装falkordb系统

复制代码
docker run -itd \
--name falkordb \
-e REDIS_ARGS="--requirepass falkordb" \
-p 6379:6379 \
-p 3000:3000 \
-v /home/falkordb/data:/var/lib/falkordb/data \
falkordb/falkordb:v4.14.9

2.2 访问页面

配置可视化页面

复制代码
http://192.168.108.147:3000/

输入密码后就能登录。

2.3 使用代码

安装依赖

复制代码
pip install FalkorDB -i https://pypi.tuna.tsinghua.edu.cn/simple

Python代码

python 复制代码
# -*- coding: utf-8 -*-

import textwrap

from falkordb import FalkorDB

# 连接FalkorDB
db = FalkorDB(host='192.168.108.147', port=6379, password="falkordb")

# 创建一个myrag图
g = db.select_graph('myrag')

# 创建节点
g.query(
	textwrap.dedent("""
		CREATE (TangSeng:Character {name: '唐僧', type: '师父', alias: ['唐三藏', '玄奘'], traits: '金蝉子转世'})
		CREATE (WuKong:Character {name: '孙悟空', type: '徒弟', alias: ['齐天大圣', '美猴王'], traits: '石猴出身'})
		CREATE (BaJie:Character {name: '猪八戒', type: '徒弟', alias: ['天蓬元帅'], traits: '好吃懒做'})
		CREATE (ShaSeng:Character {name: '沙僧', type: '徒弟', alias: ['沙和尚', '卷帘大将'], traits: '忠厚老实'})
		CREATE (BaiLongMa:Character {name: '白龙马', type: '徒弟', alias: ['小白龙'], traits: '西海龙王三太子'})
	""")
)

# 创建关系
g.query(
	textwrap.dedent("""
		// Create master-disciple relationships
		MATCH (TangSeng:Character {name: '唐僧'})
		MATCH (WuKong:Character {name: '孙悟空'})
		MATCH (BaJie:Character {name: '猪八戒'})
		MATCH (ShaSeng:Character {name: '沙僧'})
		MATCH (BaiLongMa:Character {name: '白龙马'})

		// Master-disciple relationships
		CREATE (TangSeng)-[:MASTER_DISCIPLE {relationship: '师父', startTime: '贞观十三年'}]->(WuKong)
		CREATE (TangSeng)-[:MASTER_DISCIPLE {relationship: '师父', startTime: '高老庄'}]->(BaJie)
		CREATE (TangSeng)-[:MASTER_DISCIPLE {relationship: '师父', startTime: '流沙河'}]->(ShaSeng)
		CREATE (TangSeng)-[:MASTER_DISCIPLE {relationship: '师父', startTime: '鹰愁涧'}]->(BaiLongMa)

		// Senior-junior relationships among disciples
		CREATE (WuKong)-[:SENIOR_JUNIOR {ranking: 1, title: '大师兄'}]->(BaJie)
		CREATE (WuKong)-[:SENIOR_JUNIOR {ranking: 1, title: '大师兄'}]->(ShaSeng)
		CREATE (BaJie)-[:SENIOR_JUNIOR {ranking: 2, title: '二师兄'}]->(ShaSeng)
	""")
)


# 查询数据
res = g.query(
	textwrap.dedent("""
		MATCH (TangSeng:Character {name: '唐僧'})-[:MASTER_DISCIPLE]->(disciple)
		RETURN TangSeng.name as Master, COLLECT(disciple.name) as Apprentices
	""")
)

# 打印结果
for row in res.result_set:
	print(row)
	print(row[0], row[1])

2.4 访问结果

3 Neo4j使用

3.1 Docker安装Neo4j

账号:neo4j

密码:secretgraph

复制代码
docker run -itd \
--name neo4j \
-p 7474:7474 \
-p 7687:7687 \
-v /home/neo4j/data:/data \
-v /home/neo4j/logs:/logs \
-v /home/neo4j/plugins:/plugins \
-e NEO4J_AUTH=neo4j/secretgraph \
neo4j:5.26.18

3.2 访问地址

地址信息

复制代码
http://192.168.108.147:7474/

3.3 使用代码

安装依赖

复制代码
pip install neo4j

Python代码

python 复制代码
from neo4j import GraphDatabase, Driver

# 参考地址
# https://neo4j.com/docs/python-manual/current/transactions/

# URI examples: "neo4j://localhost", "neo4j+s://xxx.databases.neo4j.io"
URI = "neo4j://192.168.108.147"
AUTH = ("neo4j", "secretgraph")

"""
# 验证连接状态
with GraphDatabase.driver(URI, auth=AUTH) as driver:
    driver.verify_connectivity()
    print("建立连接")
"""

driver: Driver = GraphDatabase.driver(URI, auth=AUTH)


def add_data(tx):
    # 使用参数化查询防止注入,并传入变量[citation:6]
    query = ("""
            
            CREATE (唐僧:角色 {名称: '唐僧', 类型: '师父', 别名: ['唐三藏', '玄奘'], 特点: '金蝉子转世'})
            CREATE (悟空:角色 {名称: '孙悟空', 类型: '徒弟', 别名: ['齐天大圣', '美猴王'], 特点: '石猴出身'})
            CREATE (八戒:角色 {名称: '猪八戒', 类型: '徒弟', 别名: ['天蓬元帅'], 特点: '好吃懒做'})
            CREATE (沙僧:角色 {名称: '沙僧', 类型: '徒弟', 别名: ['沙和尚', '卷帘大将'], 特点: '忠厚老实'})
            CREATE (白龙马:角色 {名称: '白龙马', 类型: '徒弟', 别名: ['小白龙'], 特点: '西海龙王三太子'})
            
            MATCH (唐僧:角色 {名称: '唐僧'})
            MATCH (悟空:角色 {名称: '孙悟空'})
            MATCH (八戒:角色 {名称: '猪八戒'})
            MATCH (沙僧:角色 {名称: '沙僧'})
            MATCH (白龙马:角色 {名称: '白龙马'})
    
            CREATE (唐僧)-[:师徒关系 {关系: '师父', 开始时间: '贞观十三年'}]->(悟空)
            CREATE (唐僧)-[:师徒关系 {关系: '师父', 开始时间: '高老庄'}]->(八戒)
            CREATE (唐僧)-[:师徒关系 {关系: '师父', 开始时间: '流沙河'}]->(沙僧)
            CREATE (唐僧)-[:师徒关系 {关系: '师父', 开始时间: '鹰愁涧'}]->(白龙马)
            
            // 师兄弟关系
            CREATE (悟空)-[:师兄弟 {排序: 1, 称谓: '大师兄'}]->(八戒)
            CREATE (悟空)-[:师兄弟 {排序: 1, 称谓: '大师兄'}]->(沙僧)
            CREATE (八戒)-[:师兄弟 {排序: 2, 称谓: '二师兄'}]->(沙僧)
    """)
    tx.run(query)


# 使用默认数据库
with driver.session(database="neo4j") as session:
    session.execute_write(
        add_data
    )


def match_nodes(tx, name_filter):
    result = tx.run("""
        MATCH (唐僧:角色 {名称: '唐僧'})-[:师徒关系]->(徒弟)
        RETURN 唐僧.名称 as 师父, COLLECT(徒弟.名称) as 徒弟们
        """, filter=name_filter)
    return list(result)  # a list of Record objects


with driver.session(database="neo4j") as session:
    people = session.execute_read(
        match_nodes,
        "Al",
    )
    for person in people:
        print(person.data())

3.4 访问结果

相关推荐
2301_768350232 小时前
MySQL程序
数据库·mysql
小毅&Nora2 小时前
【后端】【数据库】MongoDB存储引擎选型指南:WiredTiger如何用B+树吊打B-树
数据库·mongodb·存储引擎
VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue超市管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
喵叔哟2 小时前
9.数据库集成
数据库
范纹杉想快点毕业2 小时前
FPGA实现同步RS422转UART方案
数据库·单片机·嵌入式硬件·fpga开发·架构
醉舞经阁半卷书12 小时前
深入了解ETCD
数据库·etcd
熊文豪2 小时前
金仓数据库PL/SQL兼容性深度评测:为什么说它最接近Oracle?
数据库·pl/sql·金仓数据库·kes
廋到被风吹走2 小时前
【数据库】【MySQL】高可用与扩展方案深度解析
android·数据库·mysql
深蓝电商API2 小时前
爬虫全链路加密传输:HTTPS + 数据AES加密实战
数据库·爬虫·https