使用Neo4j实现倪李神学知识图谱
基于之前的“倪李神学”知识图谱示例(包括实体如倪柝声、
这个实现假设你有基本的编程或数据库经验。
步骤1: 安装和设置Neo4j
- 下载Neo4j:
- 访问官网(neo4j.com/download/),
下载Neo4j Desktop(免费,用于Windows/Mac/ Linux)。 - 安装后,创建新项目和数据库实例(默认用户名:neo4j,
密码:neo4j,首次需更改)。
- 访问官网(neo4j.com/download/),
- 启动数据库:
- 在Neo4j Desktop中启动数据库。
- 打开Neo4j Browser(浏览器访问http://localhost:
7474),登录后即可运行Cypher查询。
- Python驱动(可选,如果想用代码自动化):
- 如果你想用Python连接Neo4j,安装neo4j Python驱动:
pip install neo4j(在你的本地环境,不是工具中)。 - 但这里我先聚焦Cypher查询,因为它更直接。
如果你需要Python代码,我会在后面提供示例( 假设你本地运行)。
- 如果你想用Python连接Neo4j,安装neo4j Python驱动:
- 云选项:
- 如果不想本地安装,使用Neo4j Aura(aura.neo4j.io),免费创建实例,
然后用浏览器连接。
- 如果不想本地安装,使用Neo4j Aura(aura.neo4j.io),免费创建实例,
步骤2: 定义图谱 schema
- 节点标签(Labels):对应实体类型,如
:Person(人物)、 :Concept(概念)、:Book(书籍)、:(圣经引用)。Bible - 关系类型:如
EMPHASIZES(强调)、BASED_ON(基于)。 - 属性:每个节点有
name(名称)和description(描述);边有 source(来源)。
这与之前Python示例一致,便于迁移。
步骤3: 创建节点和关系(Cypher查询)
在Neo4j Browser中运行以下查询,一步步构建图谱。
- 创建节点:
- 运行以下Cypher来添加所有节点(基于之前扩展示例):
CREATE (:Person {name: '倪柝声', description: '中国基督教领袖,1903-1972,地方教会运动创始人'}); CREATE (:Person {name: '李常受', description: '倪柝声门徒,1905-1997,推动地方教会国际化'}); CREATE (:Concept {name: '神的经纶', description: '神的分赐与计划,使人成为神在生命上'}); CREATE (:Concept {name: '三一神', description: '父、子、灵的三一,神的分赐基础'}); CREATE (:Concept {name: '基督的身体', description: '教会作为基督的身体,强调建造与合一'}); CREATE (:Concept {name: '灵魂与灵的区分', description: '灵魂(意志、理智、情感)与灵(良心、直觉、交通)的区分'} ); CREATE (:Concept {name: '地方教会', description: '一城一会,强调地方性与合一'}); CREATE (:Concept {name: '基督作为生命经历', description: '基督徒对基督作为生命的经历与享受'}); CREATE (:Concept {name: '神人调和', description: '神与人调和,成为神在生命和性情上,但不在神格上'}); CREATE (:Concept {name: '神永远的旨意', description: '神要得着一个团体的彰显'}); CREATE (:Book {name: '正常的基督徒生活', description: '倪柝声著作,强调十字架与复活的生命'}); CREATE (:Book {name: '生命的经历', description: '李常受著作,详细基督作为生命的经历'}); CREATE (:Bible {name: '以弗所书1:10', description: '经纶的圣经依据:万物归一于基督'}); CREATE (:Bible {name: '希伯来书4:12', description: '灵魂与灵区分的圣经依据'}); CREATE (:Bible {name: '约翰福音14:6', description: '基督作为生命的圣经依据'}); - 这会创建15个节点。你可以分批运行,
或用UNWIND批量创建(见高级部分)。
- 运行以下Cypher来添加所有节点(基于之前扩展示例):
- 创建关系:
- 运行以下Cypher添加边(关系):
MATCH (a:Person {name: '倪柝声'}), (b:Person {name: '李常受'}) CREATE (a)-[:TEACHES {relation: '教导/影响', source: '历史传记'}]->(b); MATCH (a:Person {name: '倪柝声'}), (b:Concept {name: '基督作为生命经历'}) CREATE (a)-[:EMPHASIZES {relation: '强调', source: '正常的基督徒生活'}]->(b); MATCH (a:Person {name: '倪柝声'}), (b:Concept {name: '灵魂与灵的区分'}) CREATE (a)-[:TEACHES {relation: '教导', source: '属灵人'}]->(b); MATCH (a:Person {name: '李常受'}), (b:Concept {name: '神的经纶'}) CREATE (a)-[:CENTERS_ON {relation: '以之为中心', source: '新约总论'}]->(b); MATCH (a:Person {name: '李常受'}), (b:Concept {name: '神人调和'}) CREATE (a)-[:ELABORATES {relation: '阐述', source: '生命的经历'}]->(b); MATCH (a:Concept {name: '神的经纶'}), (b:Concept {name: '三一神'}) CREATE (a)-[:INVOLVES {relation: '涉及', source: '神学框架'}]->(b); MATCH (a:Concept {name: '神的经纶'}), (b:Concept {name: '基督的身体'}) CREATE (a)-[:AIMS_AT {relation: '目标', source: '以弗所书'}]->(b); MATCH (a:Concept {name: '神的经纶'}), (b:Bible {name: '以弗所书1:10'}) CREATE (a)-[:BASED_ON {relation: '基于', source: '圣经'}]->(b); MATCH (a:Concept {name: '基督的身体'}), (b:Concept {name: '地方教会'}) CREATE (a)-[:MANIFESTS_AS {relation: '表现', source: '地方教会运动'}]->(b); MATCH (a:Concept {name: '灵魂与灵的区分'}), (b:Concept {name: '基督作为生命经历'}) CREATE (a)-[:FOUNDATION_FOR {relation: '基础', source: '希伯来书4:12'}]->(b); MATCH (a:Concept {name: '灵魂与灵的区分'}), (b:Bible {name: '希伯来书4:12'}) CREATE (a)-[:BASED_ON {relation: '基于', source: '圣经'}]->(b); MATCH (a:Concept {name: '基督作为生命经历'}), (b:Bible {name: '约翰福音14:6'}) CREATE (a)-[:BASED_ON {relation: '基于', source: '圣经'}]->(b); MATCH (a:Person {name: '李常受'}), (b:Book {name: '生命的经历'}) CREATE (a)-[:AUTHORED {relation: '著作', source: '书籍'}]->(b); MATCH (a:Person {name: '倪柝声'}), (b:Book {name: '正常的基督徒生活'}) CREATE (a)-[:AUTHORED {relation: '著作', source: '书籍'}]->(b); MATCH (a:Concept {name: '神人调和'}), (b:Concept {name: '神永远的旨意'}) CREATE (a)-[:REALIZES {relation: '实现', source: '神学总结'}]->(b); MATCH (a:Concept {name: '三一神'}), (b:Concept {name: '神人调和'}) CREATE (a)-[:PROCESS_OF {relation: '过程', source: '三一神的分赐'}]->(b); - 每个MATCH找到源和目标节点,然后CREATE关系。
关系类型大写,便于查询。
- 运行以下Cypher添加边(关系):
步骤4: 查询和分析图谱
- 基本查询:查看所有节点和关系。
MATCH (n) RETURN n; // 返回所有节点 MATCH p = ()-->() RETURN p; // 返回所有关系路径 - 高级查询示例:
- 找出倪柝声强调的概念:
MATCH (p:Person {name: '倪柝声'})-[:EMPHASIZES|TEACHES]->(c:Concept) RETURN p.name, c.name, c.description; (返回如“倪柝声” -> “基督作为生命经历”)
- 找出基于圣经的概念路径:
MATCH path = (c:Concept)-[:BASED_ON]->(b:Bible) RETURN path; (可视化路径,如“灵魂与灵的区分” -> “希伯来书4:12”)
- 中心节点分析(使用度数):
MATCH (n) RETURN n.name, size((n)--()) AS degree ORDER BY degree DESC LIMIT 5;(找出连接最多的节点,如“神的经纶”可能度数最高)
- 找出倪柝声强调的概念:
- 可视化:在Neo4j Browser中,查询结果会自动显示为图形。点击节点可展开。
步骤5: 使用Python自动化(可选)
如果你想用Python脚本批量导入,以下是示例代码(pip install neo4j)。替换URI、用户名和密码。
from neo4j import GraphDatabase
class Neo4jGraph:
def __init__(self, uri, user, password):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
def close(self):
self.driver.close()
def create_node(self, tx, label, properties):
query = f"CREATE (n:{label} $props)"
tx.run(query, props=properties)
def create_relationship(self, tx, source_name, target_name, rel_type, rel_props):
query = (
"MATCH (a {name: $source_name}), (b {name: $target_name}) "
f"CREATE (a)-[r:{rel_type} $rel_props]->(b)"
)
tx.run(query, source_name=source_name, target_name=target_name, rel_props=rel_props)
# 连接数据库
graph = Neo4jGraph("bolt://localhost: 7687", "neo4j", "your_password")
# 示例:创建节点(类似Cypher)
with graph.driver.session() as session:
session.execute_write(graph. create_node, "Person", {"name": "倪柝声", "description": "中国基督教领袖,1903-1972"})
# 创建关系
with graph.driver.session() as session:
session.execute_write(graph. create_relationship, "倪柝声", "李常受", "TEACHES", {"relation": "教导/影响", "source": "历史传记"})
graph.close()
- 运行后,你可以用这个脚本来导入所有节点和关系(扩展为循环)。
注意事项
- 性能:对于小图谱(如这里<20节点),Neo4j很快。
如果扩展到数百节点,使用索引: CREATE INDEX FOR (n:Person) ON (n.name); - 数据来源:确保实体/关系准确,参考ministrybooks
.org等。 - 扩展:添加更多如“恢复工作”概念:
CREATE (:Concept {name: '恢复工作', description: '神在历史中的恢复'});然后添加关系。 - 备份:在Neo4j Desktop中导出为CSV或GraphML。
- 常见问题:如果查询出错,检查拼写(Cypher区分大小写)。
中文支持良好,但确保数据库编码为UTF-8。
这个实现将你的知识图谱从静态Python图转为动态数据库,