图数据库:基于历史学科的全球历史知识图谱构建,使用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]: 超文本标记语言

相关推荐
z晨晨3 小时前
Java求职面试实战:从Spring到微服务的全面挑战
java·数据库·spring·微服务·面试·技术栈
麦兜*3 小时前
Redis多租户资源隔离方案:基于ACL的权限控制与管理
java·javascript·spring boot·redis·python·spring·缓存
gsfl3 小时前
Redis 数据库管理与通信基础
数据库·redis·缓存
苏小瀚3 小时前
[MySQL] 初识数据库
数据库·mysql
还是奇怪3 小时前
SQL注入的“无影脚”:详解空格绕过WAF的N种方法
数据库·sql·安全·web安全
l1t3 小时前
DuckDB 的postgresql插件无法访问GooseDB
数据库·postgresql·插件·duckdb
葡萄城技术团队3 小时前
Wyn 商业智能软件:3D 可视化大屏搭建与工具使用全指南
3d·数据分析
下一个绝世3 小时前
免费客户管理系统推荐:适合不同行业的解决方案
大数据·人工智能
西猫雷婶3 小时前
pytorch基本运算-torch.normal()函数输出多维数据时,如何绘制正态分布函数图
人工智能·pytorch·python·深度学习·神经网络·机器学习·线性回归