文章目录

  • 一、当前应用
  • 二、知识图谱定义
  • 1.图
  • 2.架构(schema)
  • 三、构建知识图谱
  • 1.数据来源
  • 2.信息抽取难点:处理非结构化数据
  • 3.构建知识图谱需要的技术
  • 4.具体构建技术
  • 四、知识图谱的存储
  • 五、环境配置
  • 六、neo4j实战
  • 六、通过py操作neo4j
  • 七、通过csv文件批量导入图数据



一、当前应用

一个知识图谱有多个schema 知识图谱schema用途_自然语言处理

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、知识图谱定义

知识图谱是由 Google 公司在 2012 年提出来的一个新的概念。从学术的角度,我们可以对知识图谱给一个这样的定义:“知识图谱本质上是语义网络(Semantic Network)的知识库”。但这有点抽象,所以换个角度,从实际应用的角度出发其实可以简单地把知识图谱理解成多关系图(Multi-relational Graph)。

1.图

将实际中的人、物、地点等,抽闲为节点,它们彼此之间的关系为边。

2.架构(schema)

介绍:限定欲加入知识图谱的数据格式,里面包含了该领域内有意义的概念类型以及这些类型的属性。

作用:规范结构化数据的表达,一条数据必须满足Schema预先定义好的实体对象及其类型,才被允许更新到知识图谱中, 一图胜千言。

一个知识图谱有多个schema 知识图谱schema用途_自然语言处理_02


图中的DataType限定了知识图谱节点值的类型为文本、日期、数字(浮点型与整型)

图中的Thing限定了节点的类型及其属性(图中的边)

一个知识图谱有多个schema 知识图谱schema用途_数据_03

三、构建知识图谱

1.数据来源

①业务本身的数据
②网页公开数据

2.信息抽取难点:处理非结构化数据

3.构建知识图谱需要的技术

实体命名识别(Name Entity Recognition):简称NER ,目标:就是从文本里提取出实体并对每个实体做分类/打标签;
关系抽取(Relation Extraction):简称 RE,通过关系抽取技术,把实体间的关系从文本中提取出来
实体统一(Entity Resolution):简称 ER,介绍:对于有些实体写法上不一样,但其实是指向同一个实体;举例说明:比如“NYC”和“New York”表面上是不同的字符串,但其实指的都是纽约这个城市,需要合并。价值:实体统一不仅可以减少实体的种类,也可以降低图谱的稀疏性(Sparsity);
指代消解(Coreference Resolution):介绍:文本中出现的“it”, “he”, “she”这些词到底指向哪个实体,比如在本文里两个被标记出来的“it”都指向“hotel”这个实体。

4.具体构建技术

一个知识图谱有多个schema 知识图谱schema用途_自然语言处理_04

四、知识图谱的存储

知识图谱主要有两种存储方式:一种是基于RDF的存储;另一种是基于图数据库的存储。

一个知识图谱有多个schema 知识图谱schema用途_自然语言处理_05

五、环境配置

参考:
注意:下载JDK时在对应的系统里面下载,之前我在win系统里面注册了账号,想直接下载Linux版本的jdk,发现下载一直报错,后来到Ubuntu里面浏览器下载就好了。在Ubuntu上装老是出问题后面我又在win10下装了,安装好jdk后,安装neo4j,注意解压目录不能有空格(我开始放在有空格的文件夹下后面运行时报错),添加环境变量和path,之后按Ctrl+shift+ESC,点文件新建任务,勾选以管理员身份运行,输入cmd进入命令行,输入neo4j.bat console,然后在浏览器中打开http://localhost:7474/

Cypher查询语言:是Neo4J的声明式图形查询语言,允许用户不必编写图形结构的遍历代码,就可以对图形数据进行高效的查询。
设计目的:类似SQL,适合于开发者以及在数据库上做点对点模式(ad-hoc)查询的专业操作人员。
其具备的能力包括:
创建、更新、删除节点和关系
通过模式匹配来查询和修改节点和关系 - 管理索引和约束等

六、neo4j实战

删除库

MATCH (n) DETACH DELETE n

创建人物节点

CREATE (n:Person {name:'John'}) RETURN n

提示:CREATE是创建操作,Person是标签,代表节点的类型。
花括号{}代表节点的属性,属性类似Python的字典。
这条语句的含义就是创建一个标签为Person的节点,该节点具有一个name属性,属性值是John。
同样,再创建5个人物节点

CREATE (n:Person {name:'Sally'}) RETURN n
  CREATE (n:Person {name:'Steve'}) RETURN n
  CREATE (n:Person {name:'Mike'}) RETURN n
  CREATE (n:Person {name:'Liz'}) RETURN n
  CREATE (n:Person {name:'Shawn'}) RETURN n

如图所示:

一个知识图谱有多个schema 知识图谱schema用途_自然语言处理_06


创建地区节点:节点类型为location,属性有city和state

CREATE (n:Location {city:'Miami', state:'FL'})
  CREATE (n:Location {city:'Boston', state:'MA'})
  CREATE (n:Location {city:'Lynn', state:'MA'})
  CREATE (n:Location {city:'Portland', state:'ME'})
  CREATE (n:Location {city:'San Francisco', state:'CA'})

一个知识图谱有多个schema 知识图谱schema用途_一个知识图谱有多个schema_07


创建关系:

MATCH (a:Person {name:'Liz'}), 
        (b:Person {name:'Mike'}) 
  MERGE (a)-[:FRIENDS]->(b)

注:
方括号[]即为关系,FRIENDS为关系的类型。
注意这里的箭头–>是有方向的,表示是从a到b的关系。 这样,Liz和Mike之间建立了FRIENDS关系。
创建出生地关系:

MATCH (a:Person {name:'John'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1978}]->(b)

查询在Boston出生的人

MATCH (a:Person)-[:BORN_IN]->(b:Location {city:'Boston'}) RETURN a,b

查询所以对外有关系的节点

MATCH (a)--() RETURN a

查询所有关系节点

MATCH (a)-[r]->() RETURN a.name, type(r)

增加、删除节点属性:
set表示修改

MATCH (a:Person {name:'Liz'}) SET a.age=34

remove删除

MATCH (a:Person {name:'Mike'}) SET a.test='test'
  MATCH (a:Person {name:'Mike'}) REMOVE a.test

删除节点:

MATCH (a:Person {name:'Todd'})-[rel]-(b:Person) DELETE a,b,rel

六、通过py操作neo4j

neo4j模块

# 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")

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()

七、通过csv文件批量导入图数据

1.将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

3.指定neo4j使用哪个数据库

修改 /root/neo4j/conf/neo4j.conf 文件中的 dbms.default_database=mygraph.db

4.重启neo4j