惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Visual Studio Blog
The GitHub Blog
The GitHub Blog
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
人人都是产品经理
人人都是产品经理
H
Heimdal Security Blog
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
Cyberwarzone
Cyberwarzone
Google DeepMind News
Google DeepMind News
雷峰网
雷峰网
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
A
About on SuperTechFans
V2EX - 技术
V2EX - 技术
小众软件
小众软件
博客园 - Franky
博客园 - 司徒正美
P
Privacy International News Feed
爱范儿
爱范儿
U
Unit 42
博客园 - 叶小钗
The Hacker News
The Hacker News
C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Simon Willison's Weblog
Simon Willison's Weblog
N
News and Events Feed by Topic
D
Docker
T
Threatpost
MongoDB | Blog
MongoDB | Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Help Net Security
L
LINUX DO - 最新话题
Security Latest
Security Latest
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
A
Arctic Wolf
Spread Privacy
Spread Privacy

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
看完《低智商犯罪》,学习Cypher构建知识图谱
哥本哈士奇(aspnetx) · 2026-05-27 · via 博客园_首页

看完《低智商犯罪》,学习Cypher构建知识图谱

摘要

《低智商犯罪》都看了吧,是否现在还在回味剧情里每一个人物的刻画,以及每一个案件的编排。看完后咱们就来简单的学习一下,如何把剧集里的人,事件以及各种关系,构建成一个简单的知识图谱。

img

首先来看下构建的大致效果:

img

本文完整脚本的下载:

https://github.com/microsoftbi/RAGHUSKY/blob/main/Documents/dzs_knowledge_graph.cypher

以及测试文本的下载:

https://github.com/microsoftbi/RAGHUSKY/blob/main/Documents/DZS_Story.md


1. 核心概念

1.1 图数据库三要素

节点 (Node)  ──→  实体(人、案件、物品、地点、组织)
关系 (Relationship) ──→ 实体之间的连接(调查、杀害、拥有、隶属)
属性 (Property) ──→ 节点和关系上的键值对(name、role、note)

1.2 Cypher 语法基本模式

Cypher 用 ASCII 艺术描述图模式,这是它最核心的设计思想:

// 节点: (变量:标签 {属性})
(p:Person {name: '张一昂'})

// 关系: -[变量:关系类型 {属性}]->
(a)-[:KNOWS {since: 2020}]->(b)

// 方向: → 有向, - 无向
()-->()     // 有向关系
()--()      // 无向关系(查询时忽略方向)

1.3 图模型的构建

┌──────────┐    INVESTIGATES    ┌──────────┐
│  Person  │ ─────────────────→│   Case   │
└──────────┘                   └──────────┘
      │                              │
      │ BELONGS_TO                   │ HAPPENED_AT
      ↓                              ↓
┌──────────┐                   ┌──────────┐
│Organization│                 │ Location │
└──────────┘                   └──────────┘
      │                              │
      │ CONTROLS                     │ DIED_AT
      ↓                              ↓
┌──────────┐    CLUE_TO       ┌──────────┐
│  Person  │ ←────────────────│ Evidence │
└──────────┘                  └──────────┘

5 种节点标签PersonCaseOrganizationLocationEvidence

20+ 种关系类型SUPERIOR_TOKILLEDINVESTIGATESCLUE_TOBELONGS_TO


2. 约束与索引

2.1 唯一性约束 (Uniqueness Constraint)

CREATE CONSTRAINT person_name IF NOT EXISTS
FOR (n:Person) REQUIRE n.name IS UNIQUE;

语法拆解

部分 含义
CREATE CONSTRAINT person_name 创建名为 person_name 的约束
IF NOT EXISTS 幂等保护:已存在则跳过(Neo4j 4.4+)
FOR (n:Person) 约束作用于 Person 标签的节点
REQUIRE n.name IS UNIQUE 要求 name 属性值唯一

为什么需要约束?

  • 保证 MERGE 能正确匹配已有节点(否则可能创建重复节点)
  • 自动创建索引,加速 MATCH 查询
  • 数据完整性保障

2.2 约束 vs 索引

-- 约束(自动附带索引)
CREATE CONSTRAINT ... REQUIRE ... IS UNIQUE       -- 唯一性约束
CREATE CONSTRAINT ... REQUIRE ... IS NODE KEY     -- 节点键约束(同时唯一+非空)

-- 纯索引(不含约束语义,仅加速查询)
CREATE INDEX person_role FOR (n:Person) ON (n.role);
CREATE TEXT INDEX person_note FOR (n:Person) ON (n.note);  -- 全文索引

2.3 查看与删除

SHOW CONSTRAINTS;
SHOW INDEXES;
DROP CONSTRAINT person_name;

3. 创建节点

3.1 MERGE + SET 模式

脚本中大量使用的模式:

MERGE (p1:Person {name: '张一昂'})
SET p1.role = '刑警',
    p1.identity = '执法人员',
    p1.org = '省公安厅',
    p1.note = '主角,五年前因破案意外被调离刑侦一线,后重新启用';

为什么拆成 MERGE + SET?

-- ❌ 错误写法:将所有属性放入 MERGE
MERGE (p:Person {name: '张一昂', role: '刑警', note: '主角...'});
-- 问题:如果节点已存在但 role 不同,MERGE 会创建新节点(因为整体模式不匹配)

-- ✅ 正确写法:只用唯一键做 MERGE,其余用 SET
MERGE (p:Person {name: '张一昂'})   -- 只用唯一键匹配
SET p.role = '刑警',                 -- SET 总是更新
    p.note = '主角...';

核心原则MERGE 子句中只放唯一标识属性(受约束保护的字段),其余属性用 SET 单独设置。

3.2 MERGE vs CREATE

MERGE CREATE
重复执行 不创建重复 每次创建新节点
匹配已有 先查再决定 不查直接建
适用场景 构建脚本(幂等) 明确要新增
-- MERGE: 脚本可重复运行
MERGE (p:Person {name: '张一昂'});

-- CREATE: 每次都生成重复数据(除非确定数据不存在)
CREATE (p:Person {name: '张一昂'});

3.3 多属性 SET 语法

-- 方式1: 逗号分隔(脚本中使用的格式)
SET n.prop1 = 'value1',
    n.prop2 = 'value2',
    n.prop3 = 'value3';

-- 方式2: 映射批量设置
SET n += {prop1: 'value1', prop2: 'value2', prop3: 'value3'};

-- 方式3: 从已有节点复制
MATCH (a:Person {name: '张一昂'}), (b:Person {name: '李茜'})
SET b.org = a.org;  -- 复制 org 属性

3.4 变量命名惯例

MERGE (p1:Person {name: '张一昂'})   -- p1, p2, p3... 人物
MERGE (c1:Case {name: '卢正车祸案'}) -- c1, c2, c3... 案件
MERGE (o1:Organization {name: '省公安厅'}) -- o1, o2... 组织
MERGE (l1:Location {name: '三江口市'}) -- l1, l2... 地点
MERGE (e1:Evidence {name: '残缺举报信'}) -- e1, e2... 证据

变量只在当前语句有效,不需要跨语句保持一致——但良好的命名约定有助于脚本可读性


4. 创建关系

4.1 核心模式:MATCH + MERGE

MATCH (a:Person {name: '高栋'}), (b:Person {name: '张一昂'})
MERGE (a)-[:SUPERIOR_TO {note: '副厅长→下属'}]->(b);

三步分解

Step 1: MATCH (a:Person {name: '高栋'})   → 找到起始节点赋给变量 a
Step 2: MATCH (b:Person {name: '张一昂'}) → 找到目标节点赋给变量 b
Step 3: MERGE (a)-[:SUPERIOR_TO]->(b)     → 创建/匹配关系

为什么不是 MATCH ... CREATE

-- ❌ 每次运行都创建重复关系
MATCH (a:Person {name: '高栋'}), (b:Person {name: '张一昂'})
CREATE (a)-[:SUPERIOR_TO]->(b);

-- ✅ 幂等安全
MATCH (a:Person {name: '高栋'}), (b:Person {name: '张一昂'})
MERGE (a)-[:SUPERIOR_TO]->(b);

4.2 关系方向

(a)-[:SUPERIOR_TO]->(b)    // a 是 b 的上级(有向)
(a)-[:COLLEAGUE_WITH]-(b)  // a 和 b 互为同事(无向)

// 实际使用中,方向取决于语义:
// 张一昂 调查→ 案件:有意义的方向
// 张一昂-同事-李茜:双向等同,但存储时仍需选一个方向,查询时可用 ()--() 忽略方向

4.3 同标签节点间的关系(Person ↔ Person)

脚本 Part 7 中全部是 (Person)-[:REL_TYPE]->(Person) 的模式:

// 上下级:高栋 → 张一昂
MATCH (a:Person {name: '高栋'}), (b:Person {name: '张一昂'})
MERGE (a)-[:SUPERIOR_TO {note: '副厅长→下属'}]->(b);

// 杀害:朗博图 → 叶剑
MATCH (a:Person {name: '朗博图'}), (b:Person {name: '叶剑'})
MERGE (a)-[:KILLED {method: '用绑刀的车撞死', reason: '灭口'}]->(b);

// 勒索:方超 → 周荣
MATCH (a:Person {name: '方超'}), (b:Person {name: '周荣'})
MERGE (a)-[:BLACKMAILED {amount: '2000万', item: '朗博文手机'}]->(b);

同类节点间的关系对照表

关系类型 方向 示例
SUPERIOR_TO 上级→下级 高栋→张一昂
COLLEAGUE_WITH 张一昂↔李茜
SIBLING_OF 朗博文↔朗博图
IN_RELATIONSHIP_WITH 陆一波↔周淇
COOPERATES_WITH 方超↔刘直
KILLED 凶手→受害者 朗博图→叶剑
BLACKMAILED 勒索者→被勒索者 方超→周荣
COVERED_UP_FOR 包庇者→被包庇者 朗博文→朗博图
REPORTED 举报者→被举报者 陆一波→周荣
ORDERED 指使者→执行者 周荣→胡建仁
ARRESTED 执法者→被捕者 张一昂→李峰
FENCED_TO 销赃者→收赃者 方超→郑勇兵
TRANSACTED_WITH 买方→卖方 周荣→朱亦飞

5. 关系属性

5.1 语法

关系也可以携带属性,语法与节点属性相同:

MERGE (a)-[:KILLED {
  method: '用绑刀的车撞死',
  reason: '灭口——叶剑发现了手表线索'
}]->(b);

5.2 何时用关系属性 vs 节点属性

数据特点 放哪里 示例
描述关系本身的特征 关系属性 methodamountrole
描述实体自身的特征 节点属性 nameidentitynote
关系附加的上下文 关系属性 勒索金额、抓捕地点
实体的固有属性 节点属性 人名、角色、所属组织

5.3 脚本中关系属性的实际使用

// 杀害关系:记录手段和动机
[:KILLED {method: '火并枪杀', reason: '朱亦飞指使'}]

// 勒索关系:记录金额和筹码
[:BLACKMAILED {amount: '2000万', item: '朗博文手机'}]

// 指使关系:记录任务内容
[:ORDERED {task: '疏通方庸关系、处理各种事务'}]

// 调查关系:记录角色分工
[:INVESTIGATES {role: '主办'}]     // 主办
[:INVESTIGATES {role: '协办'}]     // 协办

6. 跨标签关系

6.1 Person → Case(人物 ↔ 案件)

-- 调查
MATCH (a:Person {name: '张一昂'}), (b:Case {name: '叶剑被害案'})
MERGE (a)-[:INVESTIGATES {role: '主办'}]->(b);

-- 被害
MATCH (a:Person {name: '叶剑'}), (b:Case {name: '叶剑被害案'})
MERGE (a)-[:VICTIM_OF]->(b);

-- 供述
MATCH (a:Person {name: '朗博图'}), (b:Case {name: '叶剑被害案'})
MERGE (a)-[:CONFESSED_TO {note: '在机场被截获后供认'}]->(b);

-- 涉案(通用关联,带角色说明)
MATCH (a:Person {name: '陆一波'}), (b:Case {name: '省城爆炸案'})
MERGE (a)-[:INVOLVED_IN {role: '举报人'}]->(b);

Person → Case 关系语义矩阵

关系 说明 何时使用
INVESTIGATES 调查案件 执法人员与案件
VICTIM_OF 是案件的受害者 死伤者与案件
WITNESSED 目击案件 目击者与案件
CONFESSED_TO 供认罪行 罪犯与案件
SUSPECTED_OF 涉嫌(不一定真凶) 嫌疑人(含被冤枉)
INVOLVED_IN 通用关联 不适合上述分类时使用

6.2 Evidence → Case(证据 ↔ 案件)

-- 线索
MATCH (a:Evidence {name: '限量电子表'}), (b:Case {name: '卢正车祸死亡案'})
MERGE (a)-[:CLUE_TO {note: '出现在车祸现场视频中'}]->(b);

-- 凶器
MATCH (a:Evidence {name: '绑刀的车'}), (b:Case {name: '叶剑被害案'})
MERGE (a)-[:WEAPON_OF]->(b);

-- 赃物
MATCH (a:Evidence {name: '假玉财神像'}), (b:Case {name: '省城爆炸案'})
MERGE (a)-[:LOOT_OF]->(b);

6.3 Person → Organization(人物 ↔ 组织)

-- 隶属
MATCH (a:Person {name: '张一昂'}), (b:Organization {name: '省公安厅'})
MERGE (a)-[:BELONGS_TO]->(b);

-- 控制(领导关系)
MATCH (a:Person {name: '周荣'}), (b:Organization {name: '荣城集团'})
MERGE (a)-[:CONTROLS]->(b);

BELONGS_TO vs CONTROLS

  • 普通成员用 BELONGS_TO
  • 老板/主管用 CONTROLS(暗示对组织的控制权)
  • 一个人可以同时有两者(如周荣既有 BELONGS_TO 也有 CONTROLS

6.4 Case → Case(案件 ↔ 案件)

-- 一个案件引出另一个
MATCH (a:Case {name: '省城爆炸案'}), (b:Case {name: '卢正车祸死亡案'})
MERGE (a)-[:LED_TO {note: '爆炸案现场的举报信引出卢正案重新调查'}]->(b);

-- 案件间的关联
MATCH (a:Case {name: '叶剑被害案'}), (b:Case {name: '卢正车祸死亡案'})
MERGE (a)-[:LINKED_TO {note: '叶剑因重新调查卢正案发现手表线索而被害'}]->(b);

-- 案件是系列案的一部分
MATCH (a:Case {name: '信用社抢劫案'}), (b:Case {name: '方超刘直连环抢劫案'})
MERGE (a)-[:PART_OF]->(b);

6.5 Person → Location(人物 ↔ 地点)

-- 死于某地
MATCH (a:Person {name: '叶剑'}), (b:Location {name: '河岸边'})
MERGE (a)-[:DIED_AT]->(b);

-- 前往某地
MATCH (a:Person {name: '张一昂'}), (b:Location {name: '周荣庄园'})
MERGE (a)-[:WENT_TO {note: '带队查案,最终在此逮捕周荣'}]->(b);

-- 被困某地
MATCH (a:Person {name: '方超'}), (b:Location {name: '枯井'})
MERGE (a)-[:TRAPPED_IN {note: '踩点时掉入枯井被困三天'}]->(b);

-- 在某地受伤
MATCH (a:Person {name: '李棚改'}), (b:Location {name: '涵洞'})
MERGE (a)-[:INJURED_AT {note: '追捕刚哥小毛时失足摔倒昏迷'}]->(b);

附录:脚本速查表

节点标签与数量

标签 数量 示例
Person 33 张一昂、方超、周荣、叶剑
Case 10 卢正车祸案、叶剑被害案、编钟非法交易案
Organization 7 省公安厅、荣城集团、枫林晚酒店
Location 15 三江口市、周荣庄园、河岸边、枯井
Evidence 12 残缺举报信、限量电子表、一昂血字石头

关系类型速查

关系 from → to 说明
SUPERIOR_TO Person→Person 上下级
COLLEAGUE_WITH Person→Person 同事
SIBLING_OF Person→Person 兄弟
IN_RELATIONSHIP_WITH Person→Person 情侣/夫妻
COOPERATES_WITH Person→Person 合作搭档
KILLED Person→Person 杀害
BLACKMAILED Person→Person 勒索
COVERED_UP_FOR Person→Person 包庇顶罪
REPORTED Person→Person 举报
ORDERED Person→Person 指使命令
FENCED_TO Person→Person 销赃
TRANSACTED_WITH Person→Person 非法交易
ARRESTED Person→Person 抓捕
INVESTIGATES Person→Case 调查案件
VICTIM_OF Person→Case 被害
WITNESSED Person→Case 目击
CONFESSED_TO Person→Case 供述
SUSPECTED_OF Person→Case 涉嫌
INVOLVED_IN Person→Case 涉案关联
OWNS Person→Evidence 拥有物品
DISCOVERED Person→Evidence 发现证据
LEFT_BEHIND Person→Evidence 留下线索
USED Person→Evidence 使用物品
BOUGHT_STOLEN Person→Evidence 购买赃物
BELONGS_TO Person→Organization 隶属组织
CONTROLS Person→Organization 控制组织
CLUE_TO Evidence→Case 线索指向
WEAPON_OF Evidence→Case 凶器
LOOT_OF Evidence→Case 赃物
LED_TO Case→Case 引出案件
LINKED_TO Case→Case 案件关联
PART_OF Case→Case 系列案
HAPPENED_AT Case→Location 发生地点
INVOLVES_ORG Case→Organization 涉及组织
DIED_AT Person→Location 死亡地点
WENT_TO Person→Location 前往地点
TRAPPED_IN Person→Location 被困地点
INJURED_AT Person→Location 受伤地点