huhan3000/ai-tools/scripts/neo4j_setup.py

196 lines
7.7 KiB
Python

#!/usr/bin/env python3
"""
Neo4j 数据库设置和"圐圙"词根网络构建
"""
from neo4j import GraphDatabase
import json
class KulueNetworkBuilder:
def __init__(self, uri="bolt://localhost:7687", user="neo4j", password="password"):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
def close(self):
self.driver.close()
def clear_database(self):
"""清空数据库"""
with self.driver.session() as session:
session.run("MATCH (n) DETACH DELETE n")
def create_kulue_network(self):
"""创建圐圙词根网络"""
# 核心词汇数据
kulue_words = [
# 地理概念
{"name": "昆仑", "category": "地理", "meaning": "神山", "region": "西域", "dynasty": "先秦"},
{"name": "祁连", "category": "地理", "meaning": "天山", "region": "河西", "dynasty": ""},
{"name": "轩辕", "category": "地理", "meaning": "黄帝丘", "region": "中原", "dynasty": "上古"},
{"name": "贺兰", "category": "地理", "meaning": "天山", "region": "河套", "dynasty": ""},
# 器物概念
{"name": "轱辘", "category": "器物", "meaning": "车轮", "region": "中原", "dynasty": "春秋"},
{"name": "辘轳", "category": "器物", "meaning": "井具", "region": "西域", "dynasty": ""},
{"name": "囫囵", "category": "器物", "meaning": "完整", "region": "中原", "dynasty": ""},
# 政治概念
{"name": "库伦", "category": "政治", "meaning": "都城", "region": "蒙古", "dynasty": ""},
{"name": "固伦", "category": "政治", "meaning": "公主", "region": "满洲", "dynasty": ""},
{"name": "克烈", "category": "政治", "meaning": "部落", "region": "蒙古", "dynasty": ""},
# 文化概念
{"name": "崆峒", "category": "文化", "meaning": "仙山", "region": "陇右", "dynasty": ""},
{"name": "洪洞", "category": "文化", "meaning": "移民", "region": "晋南", "dynasty": ""},
{"name": "窟窿", "category": "文化", "meaning": "石窟", "region": "西域", "dynasty": "北魏"},
# 核心概念
{"name": "圐圙", "category": "核心", "meaning": "天下", "region": "蒙古", "dynasty": ""},
{"name": "忽里勒台", "category": "核心", "meaning": "大会", "region": "蒙古", "dynasty": ""},
]
# 创建词汇节点
with self.driver.session() as session:
for word in kulue_words:
session.run("""
CREATE (w:Word {
name: $name,
category: $category,
meaning: $meaning,
region: $region,
dynasty: $dynasty
})
""", **word)
# 创建音转关系
sound_relations = [
("昆仑", "库伦", "音转"),
("昆仑", "固伦", "音转"),
("昆仑", "克烈", "音转"),
("昆仑", "崆峒", "音转"),
("昆仑", "洪洞", "音转"),
("昆仑", "圐圙", "音转"),
("轱辘", "辘轳", "音转"),
("轱辘", "囫囵", "音转"),
("圐圙", "忽里勒台", "音转"),
]
with self.driver.session() as session:
for source, target, relation in sound_relations:
session.run("""
MATCH (s:Word {name: $source})
MATCH (t:Word {name: $target})
CREATE (s)-[:SOUND_SHIFT {type: $relation}]->(t)
""", source=source, target=target, relation=relation)
# 创建语义关系
semantic_relations = [
("昆仑", "祁连", "同义"),
("昆仑", "轩辕", "同义"),
("昆仑", "贺兰", "同义"),
("轱辘", "辘轳", "功能相关"),
("库伦", "固伦", "政治相关"),
]
with self.driver.session() as session:
for source, target, relation in semantic_relations:
session.run("""
MATCH (s:Word {name: $source})
MATCH (t:Word {name: $target})
CREATE (s)-[:SEMANTIC {type: $relation}]->(t)
""", source=source, target=target, relation=relation)
def create_historical_context(self):
"""创建历史背景节点"""
dynasties = [
{"name": "先秦", "period": "公元前2070-前221", "empire": "长城"},
{"name": "秦汉", "period": "公元前221-220", "empire": "长城"},
{"name": "隋唐", "period": "581-907", "empire": "运河"},
{"name": "宋元", "period": "960-1368", "empire": "圐圙"},
{"name": "明清", "period": "1368-1912", "empire": "圐圙"},
]
with self.driver.session() as session:
for dynasty in dynasties:
session.run("""
CREATE (d:Dynasty {
name: $name,
period: $period,
empire: $empire
})
""", **dynasty)
# 创建三个帝国节点
empires = [
{"name": "长城帝国", "symbol": "长城", "meaning": "华夏大防"},
{"name": "运河帝国", "symbol": "运河", "meaning": "南北统一"},
{"name": "圐圙帝国", "symbol": "圐圙", "meaning": "天下一家"},
]
with self.driver.session() as session:
for empire in empires:
session.run("""
CREATE (e:Empire {
name: $name,
symbol: $symbol,
meaning: $meaning
})
""", **empire)
def query_kulue_network(self):
"""查询圐圙网络的示例"""
queries = {
"找到所有与'昆仑'相关的词汇": """
MATCH (k:Word {name: '昆仑'})-[r]-(related:Word)
RETURN k.name, type(r), related.name, related.meaning
""",
"查找音转路径": """
MATCH path = (start:Word)-[:SOUND_SHIFT*1..3]-(end:Word)
WHERE start.name = '昆仑'
RETURN path
""",
"按类别统计词汇": """
MATCH (w:Word)
RETURN w.category, count(w) as count
ORDER BY count DESC
""",
"查找核心概念的关联": """
MATCH (core:Word {category: '核心'})-[r]-(related:Word)
RETURN core.name, type(r), related.name, related.category
"""
}
with self.driver.session() as session:
for description, query in queries.items():
print(f"\n=== {description} ===")
result = session.run(query)
for record in result:
print(record)
def main():
# 创建数据库连接
builder = KulueNetworkBuilder()
try:
print("清空数据库...")
builder.clear_database()
print("创建圐圙词根网络...")
builder.create_kulue_network()
print("创建历史背景...")
builder.create_historical_context()
print("查询示例...")
builder.query_kulue_network()
finally:
builder.close()
if __name__ == "__main__":
main()