名称: 知识图谱构建器 描述: 设计和构建知识图谱以表示实体、关系和语义连接,支持Neo4j、RDF和属性图的查询模式。 许可证: MIT
知识图谱构建器
这个技能提供设计知识图谱的指导,捕捉实体、关系和语义意义,用于强大的查询和推理。
核心能力
- 图建模: 图的实体-关系设计
- 查询语言: Cypher (Neo4j), SPARQL (RDF), Gremlin
- 本体设计: 模式、分类法、语义关系
- 图算法: 路径查找、中心性、社区检测
知识图谱基础
什么是知识图谱
知识图谱 = 实体 + 关系 + 模式 + 语义
传统数据库: 知识图谱:
┌────────────────────┐ ┌─────────────────────────────┐
│ 表格与行 │ │ (人物)──认识──▶(人物) │
│ 外键 │ vs │ │ │
│ 连接操作 │ │ 工作于 │
│ │ │ ▼ │
└────────────────────┘ │ (公司)──属于──▶(行业) │
└─────────────────────────────┘
何时使用知识图谱
| 使用案例 | 为什么图优于其他 |
|---|---|
| 推荐系统 | 遍历连接以找到相关项目 |
| 欺诈检测 | 识别可疑关系模式 |
| 知识管理 | 连接概念并推断关系 |
| 主数据管理 | 统一跨系统的实体 |
| 根因分析 | 通过依赖关系追踪因果链 |
图数据建模
实体设计
识别核心实体(节点):
// 带属性的个人实体
CREATE (p:Person {
id: 'p001',
name: 'Alice Chen',
email: 'alice@example.com',
created_at: datetime()
})
// 多个标签用于分类
CREATE (c:Organization:Company:TechCompany {
id: 'c001',
name: 'Acme Corp',
founded: 2010
})
关系设计
用类型化、有向边建模连接:
// 简单关系
(person)-[:WORKS_AT]->(company)
// 带属性的关系
(person)-[:WORKS_AT {
role: '工程师',
start_date: date('2020-01-15'),
department: '工程部'
}]->(company)
// 时间关系
(person)-[:EMPLOYED_BY {
from: date('2018-01-01'),
to: date('2020-12-31')
}]->(company1)
(person)-[:EMPLOYED_BY {
from: date('2021-01-01')
}]->(company2)
常见关系模式
层次结构: (子节点)──是孩子──▶(父节点)
(员工)──报告给──▶(经理)
关联: (人物)──认识──▶(人物)
(文档)──引用──▶(文档)
时间: (事件)──前于──▶(事件)
(版本)──取代──▶(版本)
分类: (产品)──属于──▶(类别)
(概念)──是一种──▶(类别)
空间: (位置)──附近──▶(位置)
(区域)──包含──▶(城市)
模式定义
// 节点约束
CREATE CONSTRAINT person_id IF NOT EXISTS
FOR (p:Person) REQUIRE p.id IS UNIQUE;
CREATE CONSTRAINT company_id IF NOT EXISTS
FOR (c:Company) REQUIRE c.id IS UNIQUE;
// 属性存在性
CREATE CONSTRAINT person_name IF NOT EXISTS
FOR (p:Person) REQUIRE p.name IS NOT NULL;
// 索引用于查询性能
CREATE INDEX person_name_idx IF NOT EXISTS
FOR (p:Person) ON (p.name);
CREATE INDEX company_industry_idx IF NOT EXISTS
FOR (c:Company) ON (c.industry);
Cypher查询模式
基本遍历
// 查找所有同事(在同一公司工作的人)
MATCH (person:Person {name: 'Alice Chen'})-[:WORKS_AT]->(company)
<-[:WORKS_AT]-(colleague:Person)
WHERE colleague <> person
RETURN colleague.name, company.name
// 可变长度路径(1-3跳)
MATCH path = (start:Person)-[:KNOWS*1..3]->(end:Person)
WHERE start.name = 'Alice Chen' AND end.name = 'Bob Smith'
RETURN path, length(path) as hops
聚合
// 计数关系
MATCH (p:Person)-[:WORKS_AT]->(c:Company)
RETURN c.name, count(p) as employee_count
ORDER BY employee_count DESC
// 收集到列表
MATCH (p:Person)-[:HAS_SKILL]->(s:Skill)
RETURN p.name, collect(s.name) as skills
推荐
// "你可能认识的人" - 朋友的朋友
MATCH (me:Person {id: $userId})-[:KNOWS]-(friend)-[:KNOWS]-(suggestion)
WHERE NOT (me)-[:KNOWS]-(suggestion) AND me <> suggestion
RETURN suggestion.name, count(friend) as mutual_friends
ORDER BY mutual_friends DESC
LIMIT 10
// 基于内容:相似兴趣
MATCH (me:Person {id: $userId})-[:INTERESTED_IN]->(topic)
<-[:INTERESTED_IN]-(similar:Person)
WHERE me <> similar
WITH similar, count(topic) as shared_interests
ORDER BY shared_interests DESC
RETURN similar.name, shared_interests
LIMIT 10
路径分析
// 最短路径
MATCH path = shortestPath(
(start:Person {name: 'Alice'})-[:KNOWS*]-(end:Person {name: 'Bob'})
)
RETURN path, length(path)
// 所有最短路径
MATCH path = allShortestPaths(
(start:Person)-[:KNOWS*]-(end:Person)
)
WHERE start.name = 'Alice' AND end.name = 'Bob'
RETURN path
图算法
中心性度量
| 算法 | 目的 | 使用案例 |
|---|---|---|
| 度中心性 | 连接计数 | 查找热门节点 |
| 中介中心性 | 桥接检测 | 查找中间人或瓶颈 |
| PageRank | 影响力传播 | 排名重要性 |
| 接近中心性 | 平均距离 | 查找连接良好的节点 |
// 使用Neo4j图数据科学
CALL gds.pageRank.stream('myGraph')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS name, score
ORDER BY score DESC
LIMIT 10
社区检测
// Louvain用于社区检测
CALL gds.louvain.stream('myGraph')
YIELD nodeId, communityId
RETURN communityId, collect(gds.util.asNode(nodeId).name) as members
ORDER BY size(members) DESC
知识图谱模式
实体解析
// 查找潜在重复项
MATCH (p1:Person), (p2:Person)
WHERE p1.id < p2.id
AND (p1.email = p2.email
OR (p1.name = p2.name AND p1.birth_date = p2.birth_date))
RETURN p1, p2
// 合并重复项
MATCH (p1:Person {id: 'keep'}), (p2:Person {id: 'duplicate'})
CALL apoc.refactor.mergeNodes([p1, p2], {
properties: 'combine',
mergeRels: true
})
YIELD node
RETURN node
语义分层
┌─────────────────────────────────────────────────────┐
│ 实例层 │
│ (Alice)──认识──▶(Bob) │
│ (Alice)──工作于──▶(Acme) │
├─────────────────────────────────────────────────────┤
│ 模式层 │
│ (:Person)──能认识──▶(:Person) │
│ (:Person)──能工作于──▶(:Company) │
├─────────────────────────────────────────────────────┤
│ 本体层 │
│ (Person)──是一种──▶(Agent) │
│ (Company)──是一种──▶(Organization) │
└─────────────────────────────────────────────────────┘
时间建模
// 随时间的状态
CREATE (person)-[:HAS_STATE {
valid_from: date('2020-01-01'),
valid_to: date('2020-12-31')
}]->(state:PersonState {
status: '雇佣中',
salary: 80000
})
// 查询特定时间点的状态
MATCH (p:Person {id: $personId})-[r:HAS_STATE]->(s)
WHERE r.valid_from <= date($queryDate)
AND (r.valid_to IS NULL OR r.valid_to >= date($queryDate))
RETURN s
最佳实践
建模指南
- 优先关系而非属性 当连接有意义时
- 使用特定关系类型(如
:MANAGES而非:RELATED_TO) - 为查询建模 - 首先理解访问模式
- 保持属性原子性 - 避免使用数组存储可搜索数据
- 版本化节点,而非图 - 时间属性放在关系上
性能提示
- 索引用于WHERE子句的属性
- 使用参数(如$userId)而非字符串连接
- 限制可变长度路径(如1…5而非)
- 使用EXPLAIN和PROFILE分析查询
- 在遍历中考虑关系方向
参考文献
references/cypher-patterns.md- 高级Cypher查询示例references/graph-modeling.md- 实体和关系设计模式references/graph-algorithms.md- 算法选择和配置