#!/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()