一、知识图谱简介
“知识图谱本质上是语义网络(Semantic Network)的知识库”。但这有点抽象,所以换个角度,从实际应用的角度出发其实可以简单地把知识图谱理解成多关系图(Multi-relational Graph)。
二、怎么构建知识图谱呢?
2.1 知识图谱的数据来源
- 第一种:业务本身的数据。这部分数据通常包含在公司内的数据库表并以结构化的方式存储,一般只需要简单预处理即可以作为后续AI系统的输入;
- 第二种:网络上公开、抓取的数据。这些数据通常是以网页的形式存在所以是非结构化的数据,一般需要借助于自然语言处理等技术来提取出结构化信息。
2.2 信息抽取的难点
信息抽取的难点在于处理非结构化数据。(如图)
2.3 构建知识图谱所涉及的技术
在构建类似的图谱过程当中,主要涉及以下几个方面的自然语言处理技术:
- 实体命名识别(Name Entity Recognition,NER):就是从文本里提取出实体并对每个实体做分类/打标签。
- 关系抽取(Relation Extraction,RE):通过关系抽取技术,把实体间的关系从文本中提取出来。
- 实体统一(Entity Resolution,ER):不同词汇其实是指向同一个实体。
- 指代消解(Coreference Resolution):文本中出现的“it”, “he”, “she”这些词到底指向哪个实体
三、知识图谱的存储
知识图谱主要有两种存储方式:
- 一种是基于RDF的存储;
- 另一种是基于图数据库的存储。
其中Neo4j系统目前仍是使用率最高的图数据库,它拥有活跃的社区,而且系统本身的查询效率高,但唯一的不足就是不支持准分布式。
四、Neo4J 介绍与安装
安装完成后win下输入代码:
neo4j.bat console
4.1 Neo4J Web 界面 介绍
http://127.0.0.1:7474/browser/
4.2 Cypher查询语言
Cypher:
- 介绍:是Neo4J的声明式图形查询语言,允许用户不必编写图形结构的遍历代码,就可以对图形数据进行高效的查询。
- 设计目的:类似SQL,适合于开发者以及在数据库上做点对点模式(ad-hoc)查询的专业操作人员。
五、Neo4J 实战
参考知乎@异尘手把手教你快速入门知识图谱 - Neo4J教程
六、通过 Python 操作 Neo4j
6.1 neo4j模块:执行CQL ( cypher ) 语句
# 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")
上述程序的核心部分,抽象一下就是:
neo4j.GraphDatabase.driver(xxxx).session().write_transaction(函数(含tx.run(CQL语句)))
或者
neo4j.GraphDatabase.driver(xxxx).session().begin_transaction.run(CQL语句)
6.2 py2neo模块:通过操作python变量,达到操作neo4j的目的(需要pip3 install py2neo)
# step 1:导包
from py2neo import Graph, Node, Relationship
# step 2:构建图
g = Graph()
# step 3:创建节点
tx = g.begin()
a = Node("Person", name="Alice")
tx.create(a)
b = Node("Person", name="Bob")
# step 4:创建边
ab = Relationship(a, "KNOWS", b)
# step 5:运行
tx.create(ab)
tx.commit()
py2neo模块符合python的习惯,写着感觉顺畅,其实可以完全不会CQL也能写
其中可能会出现ClientError: [Security.Unauthorized] The client is unauthorized due to authentication failure.问题参考博客
七、通过csv文件批量导入图数据
这里我们介绍使用neo4j-admin import命令导入,适合部署在docker环境下的neo4j,参考博客。 其他导入方法也可以参考Neo4j之导入数据
csv分为两个nodes.csv和relations.csv,注意关系里的起始节点必须是在nodes.csv里能找到的:
# nodes.csv需要指定唯一ID和nam,
headers = [
'unique_id:ID', # 图数据库中节点存储的唯一标识
'name', # 节点展示的名称
'node_type:LABEL', # 节点的类型,比如Person和Location
'property' # 节点的其他属性
]
# relations.csv
headers = [
'unique_id', # 图数据库中关系存储的唯一标识
'begin_node_id:START_ID', # begin_node和end_node的值来自于nodes.csv中节点
'end_node_id:END_ID',
'begin_node_name',
'end_node_name',
'begin_node_type',
'end_node_type',
'relation_type:TYPE', # 关系的类型,比如Friends和Married
'property' # 关系的其他属性
]
制作出两个csv后,通过以下步骤导入neo4j:
- 两个文件nodes.csv ,relas.csv放在
neo4j安装绝对路径/import
- 导入到图数据库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的分隔符
- 指定neo4j使用哪个数据库
修改 /root/neo4j/conf/neo4j.conf 文件中的 dbms.default_database=mygraph.db
- 重启neo4j就可以看到数据已经导入成功了