首页 > 技术文章 > Task1:知识图谱介绍(1天)

Ethan-Chan 2021-01-11 21:56 原文

一、知识图谱简介

“知识图谱本质上是语义网络(Semantic Network)的知识库”。但这有点抽象,所以换个角度,从实际应用的角度出发其实可以简单地把知识图谱理解成多关系图(Multi-relational Graph)。

二、怎么构建知识图谱呢?

2.1 知识图谱的数据来源

  • 第一种:业务本身的数据。这部分数据通常包含在公司内的数据库表并以结构化的方式存储,一般只需要简单预处理即可以作为后续AI系统的输入;
  • 第二种:网络上公开、抓取的数据。这些数据通常是以网页的形式存在所以是非结构化的数据,一般需要借助于自然语言处理等技术来提取出结构化信息。

2.2 信息抽取的难点

信息抽取的难点在于处理非结构化数据。(如图)

2.3 构建知识图谱所涉及的技术

在构建类似的图谱过程当中,主要涉及以下几个方面的自然语言处理技术:

  1. 实体命名识别(Name Entity Recognition,NER):就是从文本里提取出实体并对每个实体做分类/打标签。
  2. 关系抽取(Relation Extraction,RE):通过关系抽取技术,把实体间的关系从文本中提取出来。
  3. 实体统一(Entity Resolution,ER):不同词汇其实是指向同一个实体。
  4. 指代消解(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:

  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的分隔符
  1. 指定neo4j使用哪个数据库
      修改 /root/neo4j/conf/neo4j.conf 文件中的 dbms.default_database=mygraph.db
  1. 重启neo4j就可以看到数据已经导入成功了
 

推荐阅读