GitHub - npubird/KnowledgeGraphCourse: 东南大学《知识图谱》研究生课程
- 什么是知识库与知识图谱
首先,在学习知识图谱的时候,尽管已经学习了很久,对于实体、关系以及属性的概念是比较了解的。但是一直被一个概念所困惑,什么是本体(Ontology)?本体和实体的区别是什么?
1.1 本体、知识库与知识图谱
知乎AI问答情况:zhida.zhihu.com
首先引用知乎答主的一个回答:
首先,本体是schema,是对特定领域概念和概念之间关系的形式化表达,本体是知识的抽象,文献中可能用Classes或Concept来表示。我个人的理解,本体在定义一个知识系统的世界观,告诉我们这个知识系统里面有人、有山、有水、水是液体、人需要喝水等等
知识库和知识图谱经常被混用,在文献《Towards a Definition of Knowledge Graphs》中对这个问题进行了阐述。
在《Knowledge-Based Systems》中定义:解决人工智能问题的知识系统由两个部分组成:知识库和推理引擎。其中知识库是一个结合形式语义信息的数据集,包含规则、事实、公理、定义和陈述等不同类型的知识。
在许多知识图谱的文章中,认为知识图谱是一个经过清洗的知识库,知识库由本体约束下的实例组成。那么就可以认为 知识图谱=本体+知识库
从两个知识库的定义上来看,知识图谱似乎包含知识库,然而,常见知识图谱中的知识库并不能完美的描述出诸如规则、公理等内容。
因此我个人倾向于对知识库的定义应该遵从《Knowledge-Based Systems》,而将知识图谱从数据组成上定义为:本体+由本体约束的实例。当然知识图谱的定义尚未有公论,甚至有文献详细的对比过各个定义,也未得出较好的结论。
综述,知识库是一个理想化的定义,和知识图谱、本体有关系,也有区别。而知识图谱是一种知识表示的方式,知识图谱包含本体。
也就是说可以将知识图谱看做“模式层(Schema Layer)”和“数据层(Data Layer)”两个部分。
[图片]
1.2 本体与知识图谱
本体(Ontology)和知识图谱(Knowledge Graph)在实际应用和表现形式上确实存在一定的关联和重叠。
本体是对概念及其相互关系的一种形式化描述,它定义了某个领域内的概念、概念的属性以及概念之间的关系。本体的核心目标是提供一种共享的、明确的概念模型,用于支持知识的表示、共享和推理。例如,在一个关于食物的本体中,会定义 “水果”“蔬菜” 等概念,以及 “属于”“包含” 等概念之间的关系。
知识图谱是一种以图的形式表示知识的方法,它由节点(实体)和边(关系)组成。知识图谱强调对实体和实体之间关系的表示,并且通常包含大量的实例数据。例如,在一个食物知识图谱中,不仅会有 “水果”“蔬菜” 等概念,还会有具体的水果实例(如 “苹果”“香蕉”)以及它们之间的具体关系(如 “苹果是水果的一种”)。 - 知识图谱的模式层和数据层
[图片]
2.1 模式层
是知识图谱的“抽象框架”,通过本体(Ontology)定义知识的结构化规则,包括类(概念)、属性、关系及约束。通常使用关系数据库(如MySQL)或本体语言(RDF/OWL)管理,部分系统通过图节点存储类层次结构(如object_type节点)。主要功能包括:
- 定义概念体系:如“音乐”域包含“歌手”“歌曲”“专辑”等类,类之间通过“演唱”“属于”等关系连接。
- 约束属性范围:例如“歌曲”类必须有“时长”属性,类型为整数,取值范围大于0。
- 通过逻辑规则(如“歌手→演唱→歌曲”的逆关系为“歌曲→被演唱→歌手”)支持语义推理。
- 提供领域共识,便于跨系统复用(如医疗本体可被多家医院共享)。
2.2 数据层
数据层是模式层的具体实例化,存储真实数据(实体、属性值、关系三元组)。使用图数据库边(Edge)存储关系,节点(Node)存储实体及属性。例如,实体指向object_type节点标识其所属类。主要功能包括: - 承载实际知识:实体是类的实例,如“周杰伦”(歌手类实体)、“《七里香》”(歌曲类实体)。关系是实体间的连接,如“周杰伦→演唱→《七里香》”。
- 动态扩展与查询:通过图数据库(如Neo4j)高效存储和查询关联数据,支持路径搜索(如“用户A→喜欢→歌手→同公司→歌手→歌曲”推荐)。
- 知识图谱的表示
知识图谱通常使用图结构来表示,其中节点代表实体(如人、地点、事物、概念等),而边则表示实体之间的关系。每个节点和边可以包含更多的属性,构成一个多层次的语义网络。
3.1 本体描述语言 - OWL (Web Ontology Language):W3C 推荐的标准语言,基于 RDF 和 RDFS,支持复杂的类、属性和个体关系建模,适用于语义网和数据集成。分为 OWL Lite、OWL DL 和 OWL Full 三种子语言,满足不同复杂度需求。
- RDF (Resource Description Framework):使用三元组(主体-谓词-对象)表示信息的基础框架,简单易用但表达能力有限,常作为其他语言的基础。
- RDFS (RDF Schema):RDF 的扩展,支持类和属性的定义,提供轻量级的层次结构建模能力,适合简单的知识表示。
- OWL 2:OWL 的升级版,增强了表达能力和推理功能,引入新特性(如键和数据范围),适用于复杂本体建模场景。
- SKOS (Simple Knowledge Organization System):轻量级语言,专注于概念及其关系的表示,适合分类法、词汇表等知识组织系统,强调易用性和互操作性。
- JSON-LD:结合 JSON 和 RDF 的轻量级格式,易于与现代 Web 应用程序集成,支持语义化数据交换和知识图谱构建,注重灵活性和可读性。
3.2 图数据库
知识图谱通常存储在图数据库中(如Neo4j),其中实体和关系通过图的节点和边表示。图数据库高效地支持图结构数据的查询、更新和分析。Neo4j 提供了一套强大的工具来管理和查询复杂的图数据。通过节点、关系、标签、属性、查询语言 Cypher、索引与约束以及遍历等功能,Neo4j 能够高效地处理高度互连的数据集。如果您正在构建一个需要处理复杂关系的应用程序,Neo4j 可能是一个值得考虑的选择。
[图片]
节点(Node)
在Neo4j中,节点代表实体或对象,并且可以拥有标签(Label)来标识其类型。例如,在电影数据库中,Person 和 Movie 可以作为节点的标签。每个节点还可以拥有属性(Property),这些属性是以键值对的形式存在,用于描述节点的具体特征。例如,一个人的节点可能有 name 和 born 属性,表示这个人的名字和出生年份。
标签是用来对节点进行分类的一种机制。通过为节点添加标签,可以有效地组织和查询数据。例如,您可以为所有表示“人”的节点添加 Person 标签,这样就可以轻松地查询所有的人节点。一个节点也可以有多个标签。
关系(Relationship)
关系在Neo4j中是连接两个节点的有向边,表示它们之间的关联。每种关系都有一个特定的类型,比如 ACTED_IN 或 DIRECTED,并且关系本身也可以拥有属性。例如,在电影数据库中,ACTED_IN 关系可能有一个 roles 属性,表示演员在电影中扮演的角色。
属性(Property)
无论是节点还是关系,都可以拥有属性,这些属性是以键值对的形式存在,用于提供额外的信息。例如,一个表示“人”的节点可能具有“name”、“age”、“gender”等属性;而一条表示“购买”行为的边可能具有“purchase_date”、“product_id”等属性。
查询语言:Cypher
Cypher 是 Neo4j 的查询语言,它允许用户以一种非常直观的方式查询和操作图数据。Cypher 语言的设计灵感来自于 SQL,但它更加专注于图数据的操作。例如,创建一个节点和关系可以通过以下 Cypher 语句实现:
CREATE (:Person {name: ‘Alice’})-[:KNOWS]->(:Person {name: ‘Bob’});
这条语句创建了两个 Person 节点,并通过 KNOWS 关系将它们连接起来。 - 总结
由此得到一个综合关系图:
知识库(容器)
│
└─知识图谱(子类)
├─模式层(本体驱动)
│ ├─类(学生、课程)
│ ├─属性(学分、先修条件)
│ └─规则(约束与推理)
│
└─数据层(实例填充)
├─实体(学生A、课程X)
└─关系(学生A→选修→课程X)
[图片]