知识图谱概述
知识图谱的含义
RDF与RDFS
RDF(Resource Description Framework,资源描述框架)和RDFS(RDF Schema,RDF模式)是构建知识图谱的基础技术之一。它们提供了一种标准的方式来表示信息,使得数据可以在Web上被共享和重用。下面是关于这两个概念的详细介绍:
RDF (Resource Description Framework)
定义: RDF是一种用于表达Web资源之间关系的数据模型。它允许你以一种结构化的方式描述事物及其之间的关联。RDF的基本单位是三元组(Triple),每个三元组由三个部分组成:
- 主体(Subject):描述的是哪个资源。
- 谓词(Predicate):描述了主体与客体之间的关系。
- 客体(Object):是主体通过谓词所关联到的值或另一个资源。
示例: 假设我们想要表达"爱丽丝喜欢阅读",可以使用以下RDF三元组来表示:
- 主体: 爱丽丝
- 谓词: 喜欢
- 客体: 阅读
在实际应用中,这些元素通常会用URI(统一资源标识符)来表示,以便在全球范围内唯一识别。例如:
- 主体:
http://example.org/people/Alice
- 谓词:
http://example.org/vocab/likes
- 客体:
http://example.org/activities/reading
这个三元组可以写作:<http://example.org/people/Alice> <http://example.org/vocab/likes> <http://example.org/activities/reading>
。
RDFS (RDF Schema)
定义: RDFS是RDF的一个扩展,它提供了一组预定义的类(Class)和属性(Property),用来对RDF中的资源进行分类和描述。RDFS使得我们可以定义资源的类型、属性的范围和域等,从而增加了语义信息。
主要概念:
- rdfs:Class :表示一个类,所有实例都属于这个类。比如,
Person
可以是一个类,所有的人都可以是它的实例。 - rdfs:subClassOf:表示类之间的继承关系。如果A rdfs:subClassOf B,则A的所有实例也都是B的实例。
- rdf:type:用于说明某个资源是某个类的实例。例如,Alice rdf:type Person 表示Alice是Person类的一个实例。
- rdfs:Property:表示一个属性,即三元组中的谓词。
- rdfs:domain 和 rdfs:range :用于指定属性的应用范围。
rdfs:domain
指定了属性的主体应该属于哪个类,而rdfs:range
则规定了属性的客体应该是什么类型的资源。
示例: 如果我们想定义一个"人"(Person)类,并且说每个人都喜欢某种活动(Activity),可以用RDFS这样描述:
- 定义类
Person
和Activity
:<http://example.org/classes/Person> rdf:type rdfs:Class .
<http://example.org/classes/Activity> rdf:type rdfs:Class .
- 定义属性
likes
,其主体是Person
类的成员,客体是Activity
类的成员:<http://example.org/vocab/likes> rdf:type rdf:Property ;
rdfs:domain <http://example.org/classes/Person> ;
rdfs:range <http://example.org/classes/Activity> .
然后,当我们说"爱丽丝喜欢阅读"时,就可以利用这些定义来更具体地描述这条信息,同时也为机器提供了更多理解上下文的能力。
通过RDF和RDFS,我们可以创建丰富的语义网络,使计算机能够更好地理解和处理人类知识。这对于构建智能应用、搜索引擎优化、数据集成等有着重要的意义。
RDF图模型
属性图模型
知识抽取
知识抽取的挑战:知识的不明确性,知识的不完备性,知识的不一致性
Cypher语言
创建节点
CREATE (p1:Person {name: 'Alice', age: 30})
CREATE (p2:Person {name: 'Tom', age: 30})
create 表示新建
小括号内是节点信息,节点的标签 label 是Person ,p1,p2 是其别名 (别名只用在Cypher语句中,且别名可以随意变,也可以没有,只是在同一语句中唯一表示该节点)
花括号内是该节点的属性
创建关系
Go
MATCH (p1:Person{name:"Alice"}), (p2:Person{name:"Tom"})
CREATE (p1)-[:Friend{name:"小学朋友"}]->(p2);
match是匹配
Friend是关系类型,花括号里面是关系边的属性
查询
查 询 所 有的 节 点
Go
MATCH (n) return (n);
查 询所有节点的数量
Go
MATCH (n) return count(n);
查 询所有的Person节点
Go
MATCH (n:Person) return (n);
查 询名字为Alice的Person节点
Go
MATCH (n:Person{name:'Alice'}) return (n)
Go
MATCH (n:Person{name:'Alice'}) RETURN (n.age)
查询Alice与Bob的关系(没有指定边的类型)
Go
MATCH (a:Person{name:"Alice"}) -[r]-> (b:Person{name:"Tom"}) return type(r);
查询Alice的朋友关系(指定边的类型)
Go
MATCH (a:Person{name:'Alice'}) -[r:Friend]-> (b:Person) return (b);
删除
移除属性
Go
MATCH (n:Person{name:'Alice'}) REMOVE (n.age)
删除节点
Go
MATCH (n:Person{name:'Alice'}) DELETE n
删除边
Go
MATCH ()-[r:KNOWS]->() DELETE r
更改
更改属性
Go
MATCH (n:Person {name: 'Alice'}) SET n.age = 31
新增属性
Go
MATCH (n:Person {name: 'Alice'}) SET n.gender='女'
Py2neo
连接数据库
python
from py2neo import Graph
graph = Graph("http://localhost:7474", auth=("neo4j", "password"))
创建节点
python
graph.run("CREATE (n:Person {name: $name, age: $age})", name="Alice", age=30)
创建关系
python
graph.run("""
MATCH (a:Person {name: $name1}), (b:Person {name: $name2})
CREATE (a)-[:KNOWS]->(b)
""", name1="Alice", name2="Bob")
查询
python
results = graph.run("MATCH (n:Person) WHERE n.name = $name RETURN n.age", name="Alice").data()
print(results)
更新
python
graph.run("MATCH (n:Person {name: $name}) SET n.age = $age", name="Alice", age=31)
删除
python
graph.run("MATCH (n:Person {name: $name}) DETACH DELETE n", name="Alice")