简单使用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

  • 示例:

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

2. 关系类型(Relationship Types)

  • 描述节点间连接的性质

  • 语法: :TYPE

  • 示例:

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

2.2 创建例子

1 中文

创建节点

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

创建关系

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

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

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

查询数据

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

2 英文

创建节点

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: '西海龙王三太子'})

创建关系

// 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)

查询数据

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代码

# -*- 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代码

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 访问结果

在这里插入图片描述

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值