知识图谱快速入门——以neo4j为例

241 阅读18分钟

什么是图数据库?

图数据库(Graph Database) 是一种以图结构(Graph) 为核心,用节点(Node)和关系(Relationship)来存储与查询数据的数据库。

它以 “关系为中心” 进行数据建模,非常适合处理实体之间复杂的连接关系,例如社交网络、知识图谱、推荐系统等。

图数据库与传统数据库的区别

对比项关系型数据库(RDBMS)图数据库(Graph DB)
数据模型表、行、列节点、关系、属性
连接方式外键、JOIN 操作直接通过关系遍历
查询语言SQLCypher
关系处理效率多表 JOIN 成本高多跳查询高效
适用场景结构化数据强关系、复杂网络数据
示例MySQL、PostgreSQLNeo4j、JanusGraph

图数据库的应用场景

场景应用说明
🧠 知识图谱存储和查询实体间语义关系
👥 社交网络用户关系、好友推荐、影响力分析
📦 推荐系统“购买了这个商品的用户还买了…”
🏦 反欺诈分析识别隐藏的欺诈链条
⚙️ IT资产管理系统依赖关系可视化
🔬 科研与专利分析技术、机构、专家、项目的关联挖掘

图数据建模原则

高质量的图模型能提高性能、避免歧义、便于后续分析。

建模目标

  • 语义清晰:节点和关系表达现实意义,易理解;
  • 关系简洁:避免无意义或重复的关系;
  • 查询高效:结构清晰、易于 Cypher 查询;
  • 可扩展性强:未来增加新实体或关系不需大改。

核心建模思想

节点代表实体,关系代表动作或联系,属性代表特征

建模原则详解

节点不重、关系有向、命名统一、属性适中、索引优化。”

或更简单地记为:

🧩 实体唯一, 🔗 关系清晰, 🏷️ 命名规范, ⚙️ 查询高效。

避免重复节点
  • 相同实体只出现一次,否则图会出现“碎片化”。
  • 唯一性由 唯一约束 保证,例如企业名称、UUID、ID。

例如:

CREATE CONSTRAINT unique_person_id FOR (p:Person) REQUIRE p.id IS UNIQUE;

使用唯一属性建模,例如:

MERGE (p:Person {name:'Alice'})
明确关系方向
  • 关系是有方向的,应体现真实语义。
  • 一般方向遵循“动作的发出方 → 接收方”。

例如:

(A:Person)-[:WORKS_AT]->(B:Company)
(B)<-[:LOCATED_IN]-(C:City)

若不关心方向,可使用无方向语法:

MATCH (a)-[:FRIEND]-(b)
命名规范
类型规范示例
标签(Label)首字母大写::Person, :Company
关系(Relationship)全大写::FRIEND_WITH, :BELONGS_TO
属性(Property)小写驼峰:createTime, companyName
文件命名若导入 CSV 或 JSON,用同名 schema 文件保持一致: 例如 person.csv + person_schema.json
合理划分节点与关系

不要把所有信息都塞进节点属性中。 能抽象成关系的,就让它成为关系。

使用合适的粒度(Granularity)
  • 节点粒度不要太粗,也不要太细。
  • 原则:一类对象,一个节点;一类关系,一种关系类型。

举例:

粒度太粗粒度适中粒度太细
一个节点包含整本书的信息每本书一个节点每页或每段文字一个节点
避免关系泛滥(Avoid Relationship Explosion)
  • 当某个节点关系过多(>10万)时,会导致性能下降。
  • 可通过中间节点(关系分层)进行缓解。

示例:

(User)-[:PURCHASED]->(Product)

若一个用户有数十万条购买记录,可以引入中间实体:

(User)-[:MADE_ORDER]->(Order)-[:CONTAINS]->(Product)
属性设计与索引优化
  • 对经常用于查询条件的属性创建索引:
CREATE INDEX person_name_index FOR (p:Person) ON (p.name)
  • 对必须唯一的属性建立约束:
CREATE CONSTRAINT unique_person_name FOR (p:Person) REQUIRE p.name IS UNIQUE
语义一致性与可读性
  • 节点、关系的语义要可直观理解

  • 图模型应当像“知识的句子”:

    (爱因斯坦) -[:提出]-> (相对论)

  • 确保业务人员一看图结构就能读懂语义。

实体合并与消歧(Entity Merging & Disambiguation)

在知识图谱中,常出现同一实体的不同表达方式:

表达实体
“IBM”“国际商业机器公司”

应通过唯一标识符或规则进行消歧:

MERGE (c:Company {code:'IBM'})
SET c.name = '国际商业机器公司'

数据建模流程建议

阶段内容示例
1. 确定实体类型人、公司、项目、技术:Person, :Company
2. 定义关系类型工作、合作、投资:WORKS_AT, :INVESTS_IN
3. 设计属性名称、时间、地点{name, founded, location}
4. 添加索引/约束提高性能,防重复UNIQUE, INDEX
5. 样例数据导入与可视化校验语义与方向Neo4j Browser / Bloom

安装Neo4j

docker安装

docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -e NEO4J_AUTH=neo4j/12345678 -v D:/neo4j/data:/data -v D:/neo4j/logs:/logs neo4j:5.26

基础概念

Neo4j 是一种属性图模型(Property Graph Model) 的图数据库。它通过 节点(Node)关系(Relationship)标签(Label)属性(Property) 来描述世界中的实体及其联系。

Neo4j 的核心概念包括:

概念英文含义
节点Node表示一个实体(如人、公司、产品)
标签Label给节点分类(如 :Person, :Company
属性Property节点或关系的键值对信息(如 name, age)
关系Relationship表示节点之间的连接(如 :WORKS_AT
方向Direction关系有方向(→ 或 ←),可用于区分语义
索引Index加速节点或关系的查询
约束Constraint确保数据一致性(如唯一约束)
路径Path节点与关系连接形成的链条,用于查询和分析
节点(Node)
  • 图中的“点”,代表现实世界的一个实体对象
  • 类似于关系型数据库中的“一行数据”。

示例:

CREATE (p:Person {name: 'Alice', age: 30})
CREATE (c:Company {name: 'Neo4j', location: 'USA'})

这里创建了两个节点:

  • (:Person) 表示一个人
  • (:Company) 表示一家公司
标签(Label)
  • 标签用于给节点分类
  • 一个节点可以有一个或多个标签
  • 标签类似于表名,但比表更灵活。

示例:

CREATE (p:Person:Employee {name:'Bob'})

这个节点同时属于 PersonEmployee 两个类别。

属性(Property)
  • 节点或关系上的键值对信息。
  • 属性可以是字符串、数值、布尔值、数组等。

示例:

CREATE (p:Person {name:'Alice', age:30, skills:['Python', 'Go']})

属性为 {name:'Alice', age:30, skills:['Python', 'Go']}

关系(Relationship)
  • 图中节点之间的连接
  • 关系必须有一个类型(Type) ,并且是有方向的
  • 可以有属性(例如建立关系的时间)。

示例:

MATCH (a:Person {name:'Alice'}), (b:Company {name:'Neo4j'})
CREATE (a)-[r:WORKS_AT {since:2022}]->(b)

关系是:

(Alice) -[:WORKS_AT {since:2022}]-> (Neo4j)
方向(Direction)
  • 关系的方向代表语义。

    • (a)-[:FRIEND]->(b)(b)-[:FRIEND]->(a)
  • 查询时可以忽略方向:

    • (a)-[:FRIEND]-(b) 表示双向匹配。
路径(Path)
  • 节点与关系的组合序列,用于遍历和查询图

示例:

MATCH p=(a:Person)-[:WORKS_AT]->(c:Company)
RETURN p

p 就是一条路径。

索引(Index)
  • 用于加快查询速度。
  • 例如为 Personname 属性创建索引:
CREATE INDEX person_name_index FOR (p:Person) ON (p.name)

查询时:

MATCH (p:Person {name:'Alice'}) RETURN p

会自动使用索引。

约束(Constraint)
  • 用来保证数据一致性,比如防止重复节点。

示例:唯一约束

CREATE CONSTRAINT unique_person_name FOR (p:Person) REQUIRE p.name IS UNIQUE

表示:Person 节点的 name 属性不能重复。

与关系型数据库层次对比

层级关系型数据库图数据库(Neo4j)
数据单元行(Row)节点(Node)
数据集合表(Table)标签(Label)
关系外键(Foreign Key)关系(Relationship)
连接方式JOIN图遍历(Graph Traversal)
查询语言SQLCypher
  • 节点 表示“东西”
  • 关系 表示“联系”
  • 标签 表示“分类”
  • 属性 表示“细节”
  • 索引与约束 保证“性能与一致性”

Cypher 基础语法结构

Cypher 查询通常由以下部分组成:

MATCH (节点)-[关系]->(节点)
WHERE 条件
RETURN 结果
关键词功能说明
CREATE创建节点或关系
MATCH查询匹配模式
WHERE添加过滤条件
RETURN返回结果
MERGE存在则匹配,不存在则创建(类似 UPSERT)
DELETE删除节点或关系
SET更新属性
ORDER BY排序
LIMIT限制返回条数
WITH中间结果传递(类似 SQL 的子查询)

节点操作

创建单个节点

CREATE (n:Person {name: 'Alice', age: 30, city: 'Beijing'})
RETURN n;

创建多个节点

CREATE 
  (:Person {name: 'Bob', age: 28}),
  (:Person {name: 'Carol', age: 25});

使用变量引用节点

CREATE (p:Product {id: 1, name: 'Hydrogen Tank', type: 'Storage'})
RETURN p;

查询所有节点

MATCH (n)
RETURN n
LIMIT 10;

查询指定标签节点

MATCH (p:Person)
RETURN p.name, p.age;

条件查询

MATCH (p:Person)
WHERE p.age > 25 AND p.city = 'Beijing'
RETURN p;

模糊查询(包含关键字)

MATCH (p:Person)
WHERE p.name CONTAINS 'li'
RETURN p;

正则匹配查询

MATCH (p:Person)
WHERE p.name =~ 'A.*'   // 以A开头
RETURN p;

更新单个节点属性

MATCH (p:Person {name: 'Alice'})
SET p.age = 31
RETURN p;

添加新属性

MATCH (p:Person {name: 'Alice'})
SET p.email = 'alice@example.com'
RETURN p;

批量更新节点属性

MATCH (p:Person)
WHERE p.city = 'Beijing'
SET p.region = 'North China'
RETURN COUNT(p);

使用 += 合并属性

MATCH (p:Person {name: 'Alice'})
SET p += {gender: 'female', job: 'Engineer'}
RETURN p;

删除节点(无关系)

MATCH (p:Person {name: 'Carol'})
DELETE p;

删除节点及其关系

MATCH (p:Person {name: 'Bob'})
DETACH DELETE p;

DETACH DELETE 会先删除所有关系,再删除节点。

删除所有节点

MATCH (n)
DETACH DELETE n;

判断节点是否存在

MATCH (p:Person {name: 'Alice'})
RETURN COUNT(p) > 0 AS exists;

使用 MERGE(存在则更新,不存在则创建)

MERGE (p:Person {name: 'Alice'})
ON CREATE SET p.createdAt = timestamp()
ON MATCH SET p.lastSeen = timestamp()
RETURN p;

批量创建节点

UNWIND [
  {name: 'Tom', age: 22},
  {name: 'Jerry', age: 24},
  {name: 'Mike', age: 28}
] AS data
CREATE (:Person {name: data.name, age: data.age});

关系操作

创建两个节点之间的关系

MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[:KNOWS]->(b)
RETURN a, b;

创建带属性的关系

MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[r:KNOWS {since: 2020, relation: 'colleague'}]->(b)
RETURN r;

创建双向关系

Neo4j 的关系是 有方向 的,但你可以创建两条关系实现“双向”:

MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[:KNOWS]->(b),
       (b)-[:KNOWS]->(a);

使用 MERGE 避免重复关系

MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
MERGE (a)-[r:KNOWS]->(b)
ON CREATE SET r.since = 2024
RETURN r;

查询节点之间的关系

MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person)
RETURN a.name, b.name, r.since;

查询特定类型的关系

MATCH (a)-[r:WORKS_WITH]->(b)
RETURN a, r, b;

双向查询(忽略方向)

MATCH (a)-[r:KNOWS]-(b)
RETURN a, r, b;

多跳关系查询(路径)

表示 Alice 与 b 之间 1~3 跳的 “KNOWS” 关系路径。

MATCH p=(a:Person {name: 'Alice'})-[:KNOWS*1..3]->(b)
RETURN p;

聚合关系

MATCH (a:Person)-[r:KNOWS]->(b)
RETURN a.name, COUNT(r) AS totalFriends;

更新关系属性

MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'})
SET r.since = 2021, r.type = 'friend'
RETURN r;

使用 += 合并属性

MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'})
SET r += {strength: 'strong', metAt: 'conference'}
RETURN r;

删除特定关系

MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'})
DELETE r;

删除节点的所有关系(但保留节点)

MATCH (a:Person {name: 'Alice'})-[r]-()
DELETE r;

删除节点及其所有关系

MATCH (a:Person {name: 'Alice'})
DETACH DELETE a;

判断关系是否存在

MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
RETURN EXISTS( (a)-[:KNOWS]->(b) ) AS relation_exists;

查询节点的度数(关系数量)

MATCH (a:Person {name: 'Alice'})
RETURN size((a)--()) AS degree;

属性操作

创建/更新属性

MATCH (p:Person {name:'Alice'})
SET p.age=31, p.city='Beijing';

合并属性

MATCH (p:Person {name:'Alice'})
SET p += {job:'Engineer', gender:'female'}
RETURN p;

删除属性

MATCH (p:Person {name:'Alice'})
REMOVE p.city, p.region
RETURN p;

关系属性操作

MATCH (a:Person {name:'Alice'})-[r:KNOWS]->(b:Person {name:'Bob'})
SET r.strength='strong'
REMOVE r.type
RETURN r;

标签操作

创建节点时使用标签

CREATE (p:Person:Employee {name:'Carol', age:25, position:'Engineer'})
RETURN p;

添加标签

MATCH (p {name:'Alice'})
SET p:Employee
RETURN p;

删除标签

MATCH (p {name:'Alice'})
REMOVE p:Employee
RETURN p;

查询标签

MATCH (p:Person:Employee)
RETURN p;

查看所有标签

CALL db.labels();

索引操作(Index)

创建索引

CREATE INDEX person_name_index FOR (p:Person) ON (p.name);

查看索引

SHOW INDEXES;

删除索引

DROP INDEX person_name_index;

约束操作

创建唯一约束

CREATE CONSTRAINT unique_person_name FOR (p:Person) REQUIRE p.name IS UNIQUE;

删除约束

DROP CONSTRAINT unique_person_name;

路径与多跳查询

固定跳数

MATCH (a:Person)-[:FRIEND]->(b:Person)-[:FRIEND]->(c:Person)
RETURN a.name, b.name, c.name;

表示 Alice 经过 1~3 层朋友能到达的人。

可变跳数(1~3跳)

MATCH (a:Person {name:'Alice'})-[:FRIEND*1..3]->(b:Person)
RETURN b;

表示 Alice 经过 1~3 层朋友能到达的人。

任意跳数

MATCH path=(a:Person {name:'Alice'})-[:FRIEND*]->(b:Person)
RETURN path;

任意深度的朋友网络(注意⚠️可能形成循环)。

最短路径

MATCH (a:Person {name:'Alice'}), (b:Person {name:'Charlie'})
MATCH path = shortestPath((a)-[:FRIEND*]-(b))
RETURN path;

所有路径(All Paths)

MATCH path = (a:Person {name:'Alice'})-[:FRIEND*1..4]->(b:Person)
RETURN path

聚合查询(Aggregation)

统计数量

MATCH (p:Person)-[:WORKS_AT]->(c:Company)
RETURN c.name, COUNT(p) AS employee_count;

收集列表

MATCH (p:Person)-[:WORKS_AT]->(c:Company)
RETURN c.name, COLLECT(p.name) AS employees;

模糊搜索与正则匹配

部分匹配(CONTAINSSTARTS WITHENDS WITH
MATCH (p:Person)
WHERE p.name CONTAINS 'Ali'
RETURN p;
​
MATCH (p:Person)
WHERE p.name STARTS WITH 'A'
RETURN p;
正则匹配(=~
MATCH (p:Person)
WHERE p.name =~ 'A.*'
RETURN p;
​
MATCH (p:Person)
WHERE p.name =~ '(?i)alice'  // 不区分大小写
RETURN p;

数据导入与导出

从 CSV 导入节点

LOAD CSV WITH HEADERS FROM 'file:///people.csv' AS row
CREATE (:Person {name: row.name, age: toInteger(row.age)});

从 CSV 导入关系

LOAD CSV WITH HEADERS FROM 'file:///works_at.csv' AS row
MATCH (p:Person {name: row.person}), (c:Company {name: row.company})
CREATE (p)-[:WORKS_AT {since: toInteger(row.since)}]->(c);

导出查询结果为 CSV

CALL apoc.export.csv.query(
  "MATCH (p:Person)-[:WORKS_AT]->(c:Company) RETURN p.name, c.name",
  "export.csv",
  {}
)

性能优化与规范建议

建立常用属性索引:

CREATE INDEX person_name_index FOR (p:Person) ON (p.name);

避免全图扫描:

// ❌ 慎用
MATCH (n) RETURN n;
// ✅ 推荐
MATCH (p:Person {name: 'Alice'}) RETURN p;

使用 LIMIT 控制返回规模:

MATCH (p:Person) RETURN p LIMIT 100;
优化技巧
技巧示例说明
使用 MERGE 代替 CREATEMERGE (p:Person {name:'Alice'})避免重复节点
使用 PROFILEEXPLAINPROFILE MATCH (p:Person)...查看查询执行计划
对常用属性建立索引CREATE INDEX FOR (p:Person) ON (p.id)加速匹配
限制返回数据量LIMIT 10避免全图扫描
使用 WITH 分步处理MATCH ... WITH ... MATCH ...提高可读性与性能

实用示例:多层级关系查询

查询企业供应链

MATCH p=(a:Company {name:'A'})-[:SUPPLIES*1..3]->(b:Company)
RETURN p;

查询共同合作的人

MATCH (a:Person)-[:WORKS_WITH]->(x)<-[:WORKS_WITH]-(b:Person)
WHERE a.name <> b.name
RETURN a.name, b.name, COUNT(x) AS commonProjects
ORDER BY commonProjects DESC;

使用示例汇总

功能Cypher 示例
查询所有节点MATCH (n) RETURN n LIMIT 20
查询节点数量MATCH (n) RETURN COUNT(n)
查询所有关系类型CALL db.relationshipTypes()
删除全部数据MATCH (n) DETACH DELETE n
查找无关系节点MATCH (n) WHERE NOT (n)--() RETURN n
统计每类节点数量MATCH (n) RETURN labels(n), COUNT(n)
按属性排序MATCH (p:Person) RETURN p.name ORDER BY p.age DESC

推荐实践组合

操作示例
创建节点CREATE (:Person {name:'Alice'})
创建关系MATCH (a),(b) CREATE (a)-[:KNOWS]->(b)
查询路径MATCH p=(a)-[:REL*1..3]->(b) RETURN p
更新属性MATCH (a)-[r:REL]->(b) SET r.prop=val
删除节点MATCH (n) DETACH DELETE n

在python中使用

安装 Neo4j Python 驱动

pip install neo4j

连接 Neo4j 数据库

from neo4j import GraphDatabase
​
# 数据库连接配置
uri = "bolt://localhost:7687"
user = "neo4j"
password = "12345678"# 创建驱动实例
driver = GraphDatabase.driver(uri, auth=(user, password))

图算法与可视化

图算法概览

Neo4j 提供了 Graph Data Science (GDS) 库,支持多种图算法,包括:

算法类别算法示例应用场景
中心性分析PageRank, Degree, Betweenness找关键节点、影响力分析
社区发现Louvain, Label Propagation群体发现、社交网络分析
路径分析Shortest Path, Dijkstra, A*最短路径、路线优化、供应链分析
相似性计算Node Similarity, Jaccard推荐系统、关系匹配
预测与嵌入Node Embeddings, GraphSAGE, FastRP节点分类、链接预测、机器学习

可视化

工具功能说明特点
Neo4j Bloom交互式可视化图数据,支持搜索、过滤、路径探索所见即所得、非技术用户友好
Gephi开源图可视化工具,支持布局、过滤、社区发现高度可自定义,可做复杂网络分析
GraphXRWeb 可视化图平台,支持大规模图和多维数据适合可视化大数据图
Cytoscape网络分析与生物网络可视化工具生物/科研图网络常用

官方文档

neo4j.com/docs/

知识图谱

什么是知识图谱

知识图谱是以图结构存储和表示知识的一种方法,通过节点(实体)边(关系) 来描述真实世界事物及其联系。

核心特征

  • 结构化:知识以机器可理解的形式组织
  • 语义化:包含丰富的语义信息和上下文
  • 互联性:强调实体间的关联关系
  • 可推理:支持基于关系的逻辑推理

核心要素

要素类型描述示例
实体(Entity)知识图谱中的"事物"人、公司、产品、地点
关系(Relation)实体间的语义关联"属于"、"生产"、"合作"
属性(Attribute)实体或关系的描述信息人名、年龄、公司地址
事件(Event)发生在实体间的动作或行为交易、招聘、合作签约

知识表示

三元组(Triple) :知识图谱的基本单位

(实体1, 关系, 实体2)
(Alice, KNOWS, Bob)
(CompanyA, SUPPLIES, ProductX)

可扩展为四元组或多元组,增加时间、权重或上下文信息:

(实体1, 关系, 实体2, 时间)

领域知识图谱

定义:针对特定行业或领域构建的知识图谱,例如氢能、医疗、金融等。

特点

  • 关注领域内实体、关系和事件
  • 可支持专业问答、决策分析、推荐系统等应用

目标:实现知识结构化、语义化和可计算化,为智能应用提供支撑。

如何构建领域知识图谱

知识建模(Knowledge Modeling)

  • 设计节点类型、关系类型和属性结构
  • 定义领域本体(Ontology),规范术语和语义

知识存储(Knowledge Storage)

  • 选择存储方案:图数据库(Neo4j)、RDF 三元组存储等
  • 设置索引与约束,提高查询性能

知识抽取(Knowledge Extraction)

  • 从文本、文档、数据库、API 等源抽取实体和关系
  • 使用 NLP、信息抽取工具或规则引擎

知识融合(Knowledge Fusion)

  • 合并来自不同来源的同类实体
  • 处理数据冲突和重复信息

知识计算(Knowledge Computation)

  • 利用图算法和规则推理生成新知识
  • 示例:路径分析、社区发现、实体相似度计算

知识应用(Knowledge Application)

  • 支持智能问答、推荐系统、决策分析、知识可视化等

关键技术

技术说明
社区发现利用图算法识别节点聚类或群组,发现实体间潜在联系
实体合并将同一实体的多个表现形式合并为统一节点
知识融合不同来源知识整合,消除冗余与冲突
消歧(Entity Disambiguation)区分同名或相似实体,保证知识唯一性

核心技术与方法

技术模块功能与说明
本体建模定义概念层次、关系语义、属性类型
实体识别(NER)从文本中识别人名、地名、机构等
关系抽取提取实体间语义联系,如“任职于”、“供应”
事件抽取抽取行为和事件信息,支持时间线分析
实体消歧区分同名实体,保证唯一性
实体对齐融合不同数据源的同一实体
图算法中心性分析、社区发现、最短路径、相似性计算
自然语言接口支持文本问答和语义搜索
知识推理逻辑推理、规则推理、因果关系分析

高质量知识图谱设计原则

  1. 实体清晰:每个节点表示单一概念
  2. 关系语义明确:关系使用动词描述,方向清晰
  3. 属性合理:核心查询字段作为节点属性,复杂对象可用子节点或 JSON 存储
  4. 标签规范:标签数量适中,避免冗余
  5. 索引与约束:保证查询性能和数据唯一性
  6. 支持常用查询模式:优化多跳查询和聚合操作
  7. 可扩展性:方便后续添加新实体、关系或属性

知识图谱实践建议

  • 从小规模开始:先做核心实体和关系,再逐步扩展
  • 关注领域知识:优先构建对业务或科研有价值的实体与关系
  • 定期更新和清洗:保持数据准确、消歧和去重
  • 结合图算法:社区发现、路径分析、影响力评估
  • 可视化辅助:使用 Bloom 或 Gephi 帮助理解复杂关系

扩展问题

neo4j如何保存多个知识图谱?

两个图谱如何合并

图谱有版本的概念吗?

neo4j如何与mysql融合使用

6️⃣ 知识图谱中的 Schema 和 Instance 有何区别?

  • Schema 层:定义知识的结构(类、关系类型)
  • Instance 层:具体数据实例(节点和边)