图数据库:基于历史学科的全球历史知识图谱构建,使用Neo4j图数据库实现中国历史与全球历史的关联查询。

目录

一、图数据库建模设计(Cypher)

python 复制代码
// 1. 创建中国历史节点(朝代->时期->事件)
CREATE (china:Country {name:"中国"})

// 1.1 创建中国朝代节点
CREATE (xia:Dynasty {name:"夏朝", start:-2070, end:-1600, capital:"阳城"}),
       (shang:Dynasty {name:"商朝", start:-1600, end:-1046, capital:"殷"}),
       (zhou:Dynasty {name:"周朝", start:-1046, end:-256, capital:"镐京/洛邑"}),
       (han:Dynasty {name:"汉朝", start:-202, end:220, capital:"长安/洛阳"}),
       (tang:Dynasty {name:"唐朝", start:618, end:907, capital:"长安"}),
       (song:Dynasty {name:"宋朝", start:960, end:1279, capital:"开封/临安"}),
       (ming:Dynasty {name:"明朝", start:1368, end:1644, capital:"南京/北京"})

// 1.2 创建中国历史事件
CREATE (battle_of_red_cliffs:Event {name:"赤壁之战", year:208, description:"三国时期著名战役"}),
       (an_shi_rebellion:Event {name:"安史之乱", year:755, description:"唐朝由盛转衰的转折点"}),
       (zheng_he_voyages:Event {name:"郑和下西洋", start_year:1405, end_year:1433, description:"明朝航海壮举"})

// 1.3 创建中国历史人物
CREATE (cao_cao:Person {name:"曹操", lifespan:"155-220", title:"三国时期政治家"}),
       (li_bai:Person {name:"李白", lifespan:"701-762", title:"唐代诗人"}),
       (zheng_he:Person {name:"郑和", lifespan:"1371-1433", title:"明朝航海家"})

// 2. 创建全球历史节点
CREATE (rome:Country {name:"罗马帝国"}),
       (england:Country {name:"英格兰"}),
       (arab:Country {name:"阿拉伯帝国"})

// 2.1 创建全球历史事件
CREATE (punic_wars:Event {name:"布匿战争", start_year:-264, end_year:-146, description:"罗马与迦太基的战争"}),
       (magna_carta:Event {name:"大宪章签署", year:1215, description:"英国限制王权的法律文件"}),
       (crusades:Event {name:"十字军东征", start_year:1096, end_year:1291, description:"基督教东征运动"})

// 3. 建立中国历史关系
// 3.1 朝代更替关系
CREATE (xia)-[:NEXT]->(shang),
       (shang)-[:NEXT]->(zhou),
       (zhou)-[:NEXT]->(han),
       (han)-[:NEXT]->(tang),
       (tang)-[:NEXT]->(song),
       (song)-[:NEXT]->(ming)

// 3.2 事件与朝代关系
CREATE (battle_of_red_cliffs)-[:OCCURRED_IN]->(han),
       (an_shi_rebellion)-[:OCCURRED_IN]->(tang),
       (zheng_he_voyages)-[:OCCURRED_IN]->(ming)

// 3.3 人物关系
CREATE (cao_cao)-[:LIVED_IN]->(han),
       (li_bai)-[:LIVED_IN]->(tang),
       (zheng_he)-[:LIVED_IN]->(ming),
       (zheng_he)-[:RELATED_TO]->(zheng_he_voyages)

// 4. 建立全球关联关系
// 4.1 时间平行关系(汉朝与罗马帝国同期)
CREATE (han)-[:CONTEMPORARY_WITH {relation:"同期文明"}]->(rome)

// 4.2 事件关联(郑和下西洋与欧洲大航海时代前)
CREATE (zheng_he_voyages)-[:BEFORE {years:70}]->(columbus_voyage:Event {
    name:"哥伦布发现美洲", year:1492
})

// 4.3 跨文明交流(唐朝与阿拉伯帝国)
CREATE (tang)-[:HAD_TRADE_WITH {route:"丝绸之路"}]->(arab)

二、时间轴查询示例(Cypher)

1. 查询中国某朝代时期的全球事件

复制代码
// 查询唐朝时期(618-907)全球重大事件
MATCH (c:Dynasty {name:"唐朝"})
MATCH (globalEvent:Event)
WHERE globalEvent.year >= c.start AND globalEvent.year <= c.end
RETURN globalEvent.name AS event, 
       globalEvent.year AS year,
       globalEvent.description AS description
ORDER BY globalEvent.year

2. 查询特定中国事件时的全球背景

复制代码
// 查询郑和下西洋时期(1405-1433)全球事件
MATCH (chinaEvent:Event {name:"郑和下西洋"})
MATCH (worldEvent:Event)
WHERE worldEvent.year >= chinaEvent.start_year 
  AND worldEvent.year <= chinaEvent.end_year
RETURN worldEvent.name AS concurrent_event,
       worldEvent.year AS year,
       CASE WHEN worldEvent.year < chinaEvent.start_year 
            THEN "之前" ELSE "同期" END AS time_relation
ORDER BY worldEvent.year

3. 跨文明关联分析

复制代码
// 查找与中国有直接关联的全球事件
MATCH (china:Country {name:"中国"})<-[:OCCURRED_IN]-(chinaEvent:Event)
MATCH (chinaEvent)-[r]-(worldEvent:Event)
RETURN chinaEvent.name AS chinese_event,
       type(r) AS relation_type,
       worldEvent.name AS world_event,
       chinaEvent.year AS china_year,
       worldEvent.year AS world_year
ORDER BY chinaEvent.year

三、Python可视化分析

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
from pyvis.network import Network

def visualize_timeline(start_year, end_year):
    # 连接Neo4j获取数据
    query = """
    MATCH (e:Event)
    WHERE e.year >= $start AND e.year <= $end
    OPTIONAL MATCH (e)-[:OCCURRED_IN]->(c:Country)
    RETURN e.name AS event, e.year AS year, 
           e.description AS description,
           coalesce(c.name, '全球') AS country
    ORDER BY year
    """
    df = pd.DataFrame([dict(record) for record in session.run(query, start=start_year, end=end_year)])
    
    # 创建时间轴图
    plt.figure(figsize=(12, 8))
    colors = {'中国': 'red', '罗马帝国': 'blue', '英格兰': 'green'}
    
    for _, row in df.iterrows():
        plt.plot(row['year'], 0, 'o', 
                color=colors.get(row['country'], 'gray'),
                markersize=10)
        plt.text(row['year'], 0.1, f"{row['event']}\n({row['year']})",
                ha='center', va='bottom', rotation=45)
    
    plt.title(f"全球历史时间轴 ({start_year}-{end_year})")
    plt.yticks([])
    plt.xlabel("年份")
    plt.grid(axis='x')
    plt.tight_layout()
    plt.savefig('global_timeline.png', dpi=300)

def create_interactive_network():
    # 创建交互式知识图谱
    query = """
    MATCH (c:Dynasty)-[r]-(e:Event)
    OPTIONAL MATCH (e)-[r2]-(ge:Event)
    RETURN *
    LIMIT 100
    """
    results = session.run(query)
    
    net = Network(height="800px", width="100%", bgcolor="#222222", font_color="white")
    
    for record in results:
        # 添加节点
        if 'Dynasty' in record['c'].labels:
            net.add_node(record['c'].id, label=record['c']['name'], 
                        group='dynasty', title=record['c']['capital'])
        elif 'Event' in record['e'].labels:
            net.add_node(record['e'].id, label=record['e']['name'], 
                        group='event', title=record['e']['description'])
        
        # 添加边
        if record['r'] is not None:
            net.add_edge(record['r'].start, record['r'].end, 
                        title=type(record['r']).__name__)
    
    net.show("history_network.html")

四、典型应用场景

1. 比较文明发展(Python实现)

python 复制代码
def compare_civilizations(dynasty_name):
    query = """
    MATCH (d:Dynasty {name: $name})
    MATCH (d)-[:CONTEMPORARY_WITH]->(c:Country)
    MATCH (c)<-[:OCCURRED_IN]-(e:Event)
    RETURN c.name AS civilization, 
           count(e) AS event_count,
           collect(e.name)[..3] AS sample_events
    """
    df = pd.DataFrame([dict(record) for record in session.run(query, name=dynasty_name)])
    
    # 生成对比图表
    df.plot.bar(x='civilization', y='event_count', 
               title=f'{dynasty_name}时期文明对比')
    plt.ylabel('重大事件数量')
    plt.tight_layout()
    plt.savefig(f'{dynasty_name}_civilization_comparison.png')

2. 历史影响路径分析

复制代码
// 查找从汉朝到罗马帝国的知识传播路径
MATCH path = (han:Dynasty {name:"汉朝"})-[:HAD_TRADE_WITH*..3]->(rome:Country {name:"罗马帝国"})
RETURN [n IN nodes(path) | n.name] AS path_nodes,
       [r IN relationships(path) | type(r)] AS relationships
LIMIT 5

3. 时间轴重叠可视化(Python)

python 复制代码
def plot_parallel_timelines():
    query = """
    MATCH (c:Dynasty)-[:NEXT*]->(d:Dynasty)
    WITH collect(DISTINCT c) + collect(DISTINCT d) AS dynasties
    UNWIND dynasties AS d
    MATCH (d)<-[:OCCURRED_IN]-(e:Event)
    RETURN d.name AS dynasty, d.start AS start, d.end AS end,
           collect({name:e.name, year:e.year}) AS events
    """
    
    fig, axes = plt.subplots(figsize=(15, 8))
    
    # 绘制朝代时间条
    for i, record in enumerate(session.run(query)):
        axes.barh(i, width=record['end']-record['start'], 
                 left=record['start'], alpha=0.6)
        axes.text(record['start'], i, record['dynasty'], 
                 ha='left', va='center')
        
        # 标注事件
        for event in record['events']:
            axes.plot(event['year'], i, 'ro')
            axes.text(event['year'], i+0.1, event['name'], 
                     rotation=45, ha='right')
    
    axes.set_yticks([])
    axes.set_xlabel("年份")
    axes.set_title("中国朝代与重大事件时间轴")
    plt.tight_layout()
    plt.savefig('dynasty_timeline.png', dpi=300)

五、知识图谱扩展建议

1.添加更多维度数据​​

复制代码
// 添加科技发展节点
CREATE (papermaking:Technology {name:"造纸术", origin:"中国", century:2}),
       (printing:Technology {name:"印刷术", origin:"中国", century:8})

// 建立技术传播路径
MATCH (c:Dynasty {name:"汉朝"}), (t:Technology {name:"造纸术"})
CREATE (c)-[:INVENTED]->(t)
CREATE (t)-[:SPREAD_TO {century:8}]->(:Country {name:"阿拉伯帝国"})

2.​​实现时空查询函数​​

复制代码
// 创建自定义函数(需安装APOC库)
CALL apoc.custom.asFunction(
  'events.around',
  'MATCH (e:Event) 
   WHERE e.year >= $year - 50 AND e.year <= $year + 50
   RETURN e',
  'READ',
  [['e', 'NODE']],
  true,
  '查找某年份前后50年的相关事件'
)

3.构建GDS图算法分析​​

复制代码
// 发现历史关键转折点(使用PageRank算法)
CALL gds.graph.create('history', 
  ['Event', 'Dynasty', 'Country'], 
  ['OCCURRED_IN', 'CONTEMPORARY_WITH', 'HAD_TRADE_WITH']
)

CALL gds.pageRank.stream('history')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS name, score
ORDER BY score DESC LIMIT 10

六、小结

这套方案通过:

​​时空双重维度建模​​:精确到年的历史事件定位

​​跨文明关联网络​​:揭示文明交流的隐藏模式

​​多层级结构​​:国家->朝代->事件->人物的知识体系

​​交互式可视化​​:直观展示复杂历史关系

典型查询示例:"当中国处于宋朝(960-1279)时,欧洲正在发生哪些重大事件?这些事件如何通过丝绸之路与中国产生关联?"

七、欢迎纠错

欢迎纠错,随时更新。

联系方式:评论、私信,或 企鹅 :179 0042 182 。

码字不易,如觉得还可以,请给个免费的 zan 和 soucang ,让我有动力继续写下去。

八、免费爬虫

https://affiliate
.bazhuayu
.com
/M8lKUC

九、论文写作/Python 学习智能体

https://chatglm.cn/share/WF2C5ree


  • 以下关于 Markdown 编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

++ 新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法[1](#甘特图的mermaid语法1) 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

++ 功能快捷键

撤销:Ctrl/Command + Z

重做:Ctrl/Command + Y

加粗:Ctrl/Command + B

斜体:Ctrl/Command + I

标题:Ctrl/Command + Shift + H

无序列表:Ctrl/Command + Shift + U

有序列表:Ctrl/Command + Shift + O

检查列表:Ctrl/Command + Shift + C

插入代码:Ctrl/Command + Shift + K

插入链接:Ctrl/Command + Shift + L

插入图片:Ctrl/Command + Shift + G

查找:Ctrl/Command + F

替换:Ctrl/Command + G

++ 合理的创建标题,有助于目录的生成

直接输入1次+,并按下space后,将生成1级标题。

输入2次+,并按下space后,将生成2级标题。

以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

++ 如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

++ 插入链接与图片

链接: link.

图片:

带尺寸的图片:

居中的图片:

居中并且带尺寸的图片:

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

++ 如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

javascript 复制代码
// An highlighted block
var foo = 'bar';

++ 生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

++ 创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

+++ 设定内容居中、居左、居右

使用:---------:居中

使用:----------居左

使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

+++ SmartyPants

SmartyPants将ASCII标点字符转换为"智能"印刷标点HTML实体。例如:

TYPE ASCII
Single backticks 'Isn't this fun?' 'Isn't this fun?'
Quotes "Isn't this fun?" "Isn't this fun?"
Dashes -- is en-dash, --- is em-dash -- is en-dash, --- is em-dash

++ 创建一个自定义列表

Markdown

: Text-to- conversion tool
:
John
:
Luke

++ 如何创建一个注脚

一个具有注脚的文本。[2](#2)

++ 注释也是必不可少的

Markdown将文本转换为 。

++ KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

++ 新的甘特图功能,丰富你的文章
2014-01-07 2014-01-09 2014-01-11 2014-01-13 2014-01-15 2014-01-17 2014-01-19 2014-01-21 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid

  • 关于 甘特图 语法,参考 这儿,

++ UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:
链接 长方形 圆 圆角长方形 菱形

  • 关于 Mermaid 语法,参考 这儿,

++ FLowchart流程图

我们依旧会支持flowchart的流程图:
Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no

  • 关于 Flowchart流程图 语法,参考 这儿.

++ 导出与导入

+++ 导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

+++ 导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,

继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

*[HTML]: 超文本标记语言

相关推荐
新子y3 分钟前
【小白笔记】input() 和 print() 这两个函数
笔记·python
2301_7720935615 分钟前
高并发webserver_interview
运维·服务器·数据库·后端·网络协议·mysql·wireshark
文火冰糖的硅基工坊40 分钟前
[人工智能-大模型-72]:模型层技术 - 模型训练六大步:①数据预处理 - 基本功能与对应的基本组成函数
开发语言·人工智能·python
大G的笔记本1 小时前
MySQL 大表查询优化、超大分页处理、SQL 慢查询优化、主键选择
数据库·sql·mysql
0和1的舞者2 小时前
《Git:从入门到精通(八)——企业级git开发相关内容》
大数据·开发语言·git·搜索引擎·全文检索·软件工程·初学者
Lear2 小时前
Redis 持久化机制
数据库
儒道易行2 小时前
【攻防实战】Redis未授权RCE联动metasploit打穿三层内网(上)
数据库·redis·网络安全·缓存
Python×CATIA工业智造2 小时前
Pycatia二次开发基础代码解析:组件识别、选择反转与链接创建技术解析
python·pycharm
小宁爱Python3 小时前
从零搭建 RAG 智能问答系统 6:Text2SQL 与工作流实现数据库查询
数据库·人工智能·python·django
yjsstar3 小时前
数据库MySQL基础
数据库·mysql