简单使用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 访问结果

