知识图谱构建器 knowledge-graph-builder

该技能用于设计和构建知识图谱,以表示实体、关系和语义连接,支持Neo4j、RDF等图数据库的查询模式。核心能力包括图建模、查询语言(如Cypher、SPARQL)、本体设计和图算法应用,适用于知识管理、推荐系统、欺诈检测、根因分析等场景。关键词:知识图谱、图数据库、Neo4j、RDF、语义连接、图算法、Cypher、SPARQL、实体建模。

数据工程 0 次安装 0 次浏览 更新于 3/7/2026

name: 知识图谱构建器 description: 设计和构建知识图谱以表示实体、关系和语义连接,支持Neo4j、RDF和属性图的查询模式。 license: MIT

知识图谱构建器

该技能提供设计知识图谱的指导,以捕获实体、关系和语义意义,用于强大的查询和推理。

核心能力

  • 图建模: 图的实体-关系设计
  • 查询语言: Cypher (Neo4j)、SPARQL (RDF)、Gremlin
  • 本体设计: 模式、分类法、语义关系
  • 图算法: 路径查找、中心性、社区检测

知识图谱基础

什么是知识图谱

知识图谱 = 实体 + 关系 + 模式 + 语义

传统数据库:          知识图谱:
┌────────────────────┐         ┌─────────────────────────────┐
│ 包含行的表        │         │ (人)──认识──▶(人)          │
│ 外键             │   vs    │     │                       │
│ JOIN操作         │         │   工作于                    │
│                    │         │     ▼                       │
└────────────────────┘         │ (公司)──属于──▶(行业)      │
                               └─────────────────────────────┘

何时使用知识图谱

使用案例 为什么图表现出色
推荐系统 遍历连接以找到相关项
欺诈检测 识别可疑关系模式
知识管理 连接概念并推断关系
主数据管理 统一跨系统的实体
根因分析 通过依赖关系追踪因果链

图数据建模

实体设计

识别核心实体(节点):

// 带属性的Person实体
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: 'employed',
    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

最佳实践

建模指南

  1. 优先关系而非属性 当连接有意义时
  2. 使用特定关系类型 (:MANAGES 而非 :RELATED_TO)
  3. 为查询建模 - 首先理解访问模式
  4. 保持属性原子性 - 无数组用于可搜索数据
  5. 版本节点,而非图 - 时间属性在关系上

性能提示

  • 索引WHERE子句中使用的属性
  • 使用参数($userId)而非字符串连接
  • 限制可变长度路径(*1…5 而非 *)
  • 使用EXPLAIN和PROFILE分析查询
  • 在遍历中考虑关系方向

参考

  • references/cypher-patterns.md - 高级Cypher查询示例
  • references/graph-modeling.md - 实体和关系设计模式
  • references/graph-algorithms.md - 算法选择和配置