学术角度:语义网络(Semantic Network)的知识库
应用角度:多关系图(Multi-relational Graph) ----包含多种类型节点和多种类型边
用于限定待加入知识图谱数据的格式。
DataType:限定知识图谱节点值的类型
Thing:限定节点的类型及属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-orN6Dnlw-1610418915025)(https://typora-upic-1304199839.cos.ap-shanghai.myqcloud.com/upload/image-20210111213837054.png)]
举例说明:基于上图Schema构建的知识图谱中仅可含作品、地方组织、人物;其中作品的属性为电影与音乐、地方组织的属性为当地的商业(eg:饭店、俱乐部等)、人物的属性为歌手
例:下图表示从英文文本(非结构化数据)中抽取的实体和关系。
目标:从文本里提取出实体并对每个实体做分类/打标签
举例说明:提取出实体“NYC”,并标记实体类型为 “Location”;我们也可以从中提取出“Virgil’s BBQ”,并标记实体类型为“Restarant”
目标:把实体间的关系从文本中提取出来
举例说明:比如实体“hotel”和“Hilton property”之间的关系为“in”;“hotel”和“Time Square”的关系为“near”等等
目的:有些实体写法上不一样,但其实是指向同一个实体,对这些实体进行合并
举例说明:比如“NYC”和“New York”表面上是不同的字符串,但其实指的都是纽约这个城市,需要合并
目的:还原代词指向的实体
举例说明:文本中出现的“it”, “he”, “she”这些词到底指向哪个实体,比如在本文里两个被标记出来的“it”都指向“hotel”这个实体
存储形式:以三元组形式且不包含属性信息
特点:易于发布和共享
例:Jena
基于图数据库的存储
存储形式:以属性图为基本的表示形式,所以实体和关系可以包含属性
特点:高效的图查询和搜索
例:Neo4j、OrientDB、JanusGraph
参照博客https://blog.csdn.net/huacha__/article/details/81123410
Neo4j 3.x 对应 jdk 8.x
Neo4j 4.x 对应 jdk 11.x
登陆本地库时可能会出现下图的问题
输入 用户名:neo4j 密码:neo4j 即可
只有一些简单的查询操作才在web界面中进行,一般还是使用Python等的driver在程序中实现
Tips:使用web界面创建节点后,要显示所有节点的大图的话,点击左侧Node Labels下的图标即可
# step 1:导入 Neo4j 驱动包
from neo4j import GraphDatabase
# step 2:连接 Neo4j 图数据库
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
# 添加 关系 函数
def add_friend(tx, name, friend_name):
tx.run("MERGE (a:Person {name: $name}) "
"MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})",
name=name, friend_name=friend_name)
# 定义 关系函数
def print_friends(tx, name):
for record in tx.run("MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name "
"RETURN friend.name ORDER BY friend.name", name=name):
print(record["friend.name"])
# step 3:运行
with driver.session() as session:
session.write_transaction(add_friend, "Arthur", "Guinevere")
session.write_transaction(add_friend, "Arthur", "Lancelot")
session.write_transaction(add_friend, "Arthur", "Merlin")
session.read_transaction(print_friends, "Arthur")
更符合Python的习惯,不需要写CQL
# step 1:导入 Neo4j 驱动包
from neo4j import GraphDatabase
# step 2:连接 Neo4j 图数据库
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
# 添加 关系 函数
def add_friend(tx, name, friend_name):
tx.run("MERGE (a:Person {name: $name}) "
"MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})",
name=name, friend_name=friend_name)
# 定义 关系函数
def print_friends(tx, name):
for record in tx.run("MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name "
"RETURN friend.name ORDER BY friend.name", name=name):
print(record["friend.name"])
# step 3:运行
with driver.session() as session:
session.write_transaction(add_friend, "Arthur", "Guinevere")
session.write_transaction(add_friend, "Arthur", "Lancelot")
session.write_transaction(add_friend, "Arthur", "Merlin")
session.read_transaction(print_friends, "Arthur")
需要两个csv文件,分为node.csv和relation.csv
1、两个文件nodes.csv ,relas.csv放在
neo4j安装绝对路径/import
2、导入到图数据库mygraph.db
neo4j bin/neo4j-admin import --nodes=/var/lib/neo4j/import/nodes.csv --relationships=/var/lib/neo4j/import/relas.csv --delimiter=^ --database=xinfang*.db
delimiter=^ 指的是csv的分隔符
3、指定neo4j使用哪个数据库
修改 /root/neo4j/conf/neo4j.conf 文件中的 dbms.default_database=mygraph.db
4、重启neo4j就可以看到数据已经导入成功了