我的知识图谱和Neo4j数据库的使用

知识图谱概述

知识图谱的含义

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:domainrdfs:range :用于指定属性的应用范围。rdfs:domain指定了属性的主体应该属于哪个类,而rdfs:range则规定了属性的客体应该是什么类型的资源。

示例: 如果我们想定义一个"人"(Person)类,并且说每个人都喜欢某种活动(Activity),可以用RDFS这样描述:

  • 定义类 PersonActivity
    • <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")
相关推荐
CodeWithMe1 分钟前
【C/C++】std::vector成员函数清单
开发语言·c++
uyeonashi2 分钟前
【QT控件】输入类控件详解
开发语言·c++·qt
iCxhust1 小时前
Prj10--8088单板机C语言8259测试(1)
c语言·开发语言
крон4 小时前
【Auto.js例程】华为备忘录导出到其他手机
开发语言·javascript·智能手机
zh_xuan5 小时前
c++ 单例模式
开发语言·c++·单例模式
老胖闲聊5 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1185 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
曹勖之6 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?6 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头6 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#