一般情况下,我们使用数据库查找事物间的联系的时候,只需要短程关系的查询(两层以内的关联)。当需要进行更长程的,更广范围的关系查询时,就需要图数据库的功能。

而随着社交、电商、金融、零售、物联网等行业的快速发展,现实世界的事物之间织起了一张巨大复杂的关系网,传统数据库面对这样复杂关系往往束手无策。因此,图数据库应运而生。

图数据库(Graph database)指的是以图数据结构的形式来存储和查询数据的数据库。

从 http://db-engines.com/en/ranking 可以发现,Neo4j 是目前用的最多的图数据库,世界数据库排行榜上排名21位。

Neo4J属于原生图数据库,其使用的存储后端专门为图结构数据的存储和管理进行定制和优化的,在图上互相关联的节点在数据库中的物理地址也指向彼此,因此更能发挥出图结构形式数据的优势。

知识图谱中,知识的组织形式采用的就是图结构,所以非常适合用neo4j进行存储

图数据库的优势在于:

数据存储形式

neo4j的数据存储形式 主要是 节点(node)和 边(edge) 来组织数据。node可以代表知识图谱中的实体,edge可以用来代表实体间的关系,关系可以有方向,两端对应开始节点和结束节点。

另外,可以在node上加一个或多个标签(Node Label)表示实体的分类,以及一个键值对集合来表示该实体除了关系属性之外的一些额外属性。关系也可以附带额外的属性。

查询语言cypher

neo4j采用自己设计的查询语言cypher,其特点和sql有很多相似的地方。match、where、return是最常用到的关键词:

安装neo4j

这里我们使用docker安装neo4j,安装命令行如下:

docker run -d --name=Neo4j\    --publish=7474:7474 --publish=7687:7687 \    --volume=$HOME/neo4j/data:/data --volume=$HOME/neo4j/import:/import\    neo4j
    --volume=$HOME/neo4j/data:/data --volume=$HOME/neo4j/import:/import\
    neo4j

根据配置参数,我们将容器内的7474端口挂载到外部宿主机的7474端口,并设置好文件夹的映射关系,注意/import文件夹下放的是将要导入数据库的csv文件。

接着在浏览器中打开 “ http://localhost:7474/ ”,就可以访问Neo4j管理界面了。

neo4j网页管理界面

我们通过一个例子来说明如何运用neo4j数据库。

1. 导入数据

我们这里有两个csv文件如下图,左边的nodes_companies.csv是一部分公司节点,右边的edges_director_duration.csv是这些公司互相之间的服务关系

nodes_companies.csv文件和edges_director_duration.csv

把这两个文件放到neo4j根目录下的import文件夹内,使用LOAD…AS row语句读取,表示将csv文件按行读取,每行的变量名为row。再使用MERGE指令创建节点,将csv文件的第一列数据与第二列数据汇总为一个结点内的两条属性信息。

LOAD CSV WITH HEADERS FROM "file:///nodes_companies.csv" AS rowMERGE (c:Company {companyId:row.companyId, companyName:row.name})WITH HEADERS FROM "file:///nodes_companies.csv" AS row
MERGE (c:Company {companyId:row.companyId, companyName:row.name})

这里提一下cypher中两个用于创建新的数据的两个关键词: create 和 merge

merge:在数据库中可以匹配到模式相同的数据就返回,没有则创建一条这样的数据(有则返回,没有则创建

create:无论如何,都会创建一条新的数据

上面再LOAD文件时使用merge可以避免导入完全重复的数据

导入公司节点

通过第二个csv文件的START_ID和END_ID字段为第一个csv文件的company之间建立联系,即不断遍历第二个文件的每一行,根据START_ID和END_ID使用where找到图中相应节点,并为它们添加相应的服务(INTERLOCK)关系,添加关系属性为weight。

LOAD CSV WITH HEADERS FROM "file:///edges_director_duration.csv" AS rowmatch (c1:company), (c2:company)where row.START_ID = c1.id and row.END_ID = c2.idcreate (c1)-[r:INTERLOCK{weight:row.years_served}]->(c2)WITH HEADERS FROM "file:///edges_director_duration.csv" AS row
match (c1:company), (c2:company)
where row.START_ID = c1.id and row.END_ID = c2.id
create (c1)-[r:INTERLOCK{weight:row.years_served}]->(c2)

注意在cypher语句里,节点是用()括起来表示,关系则用 [] 括起来表示

导入公司关系

2.创建关系

这里我们尝试自己创建一条新的关系,比如在id = 281 和 id = 879 的两个节点间创建一条标签为“INTERLOCK”的关系。

先match和where锁定 id = 281 和 id = 879的两个公司节点,然后用create创建他们之间的关系,并添加特定关系属性信息(例如weight为10)。

cypher语句如下:

MATCH (c1:company),(c2:company) WHERE c1.id = “281” AND c2.id = “879” CREATE (c1)-[r:INTERLOCK{weight:10}]->(c2) RETURN (c1)-[r]-(c2)CREATE (c1)-[r:INTERLOCK{weight:10}]->(c2) RETURN (c1)-[r]-(c2)

这条语句的意思是,匹配类别标签为company,id分别等于281和879的两个公司节点,设置变量名为c1和c2,在他们之间创建关系,关系变量名为r,这里 ()-[]-() 代表无向边,()-[]->() 代表有向边

返回结果 (c1)-[r]-(c2) 匹配到的子图如下所示:

创建新的关系

3.比较复杂的查询

下面这条语句会把所有公司中,指向其他公司的连接关系数超过75条的公司全部找出来。用空括号()代表任一节点,函数count() 计算关系的数量。

MATCH (c:company)-[r:INTERLOCK]->() WITH c, count(r) as relaNum WHERE relaNum>=75 RETURN c,relaNum

4.最短路径查询

neo4j还还内置实现了一套图搜索算法,并提供了相关函数接口,比如你想查询两个节点之间的最短路径,就可以用下面的查询语句:

match (c1:company), (c2:company), p=shortestPath((c1)-[r:INTERLOCK*..10]->(c2))where c1.id <> c2.idreturn p,length(p) order by length(p) desc limit 1000
return p,length(p) order by length(p) desc limit 1000

直接调用函数shortestPath,传入的参数为选定的关系,选取任意两个节点,<>表示id不相等,因为查找的两个点不能是同一个点,*..10表示10度以内的所有关系,返回降序排序的长度,限制在1000个防止内存溢出)

MATCH (c1:company), (c2:company), p = allshortestpaths((c1)-[r:INTERLOCK*]-(c2))WHERE c1.id <> c2.idRETURN extract(n in nodes(p)|n.name) as Nodes, length(p) as pathLength,reduce(s=0, e in relationships(p)| s + toInt(e.weight)) as pathDist LIMIT 1000
RETURN 
extract(n in nodes(p)|n.name) as Nodes, 
length(p) as pathLength,
reduce(s=0, e in relationships(p)| s + toInt(e.weight)) as pathDist 
LIMIT 1000

allshortestpaths函数返回结果

语句中的pathLength是路径的边数(第一句return),pathDist是路径上所有带weight边的加权总和(第二句return)。

欢迎关注磐创博客资源汇总站:

http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:

http://pytorch.panchuang.net/

​知识图谱里的知识存储:neo4j的介绍和使用的更多相关文章

  1. 知识图谱+Recorder︱中文知识图谱API与工具、科研机构与算法框架

    目录 分为两个部分,笔者看到的知识图谱在商业领域的应用,外加看到的一些算法框架与研究机构. 文章目录 @ 一.知识图谱商业应用 01 唯品金融大数据 02 PlantData知识图谱数据智能平台 03 ...

  2. 知识图谱里的知识表示:RDF

    大部分知识图谱使用RDF描述世界上的各种资源,并以三元组的形式保存到知识库中.RDF( Resource Description Framework, 资源描述框架)是一种资源描述语言,它受到元数据标 ...

  3. 知识图谱之图数据库Neo4j

    知识图谱中的知识是通过RDF结构来进行表示的,其基本单元是事实.每个事实是一个三元组(S, P, O),在实际系统中,按照存储方式的不同,知识图谱的存储可以分为基于表结构的存储和基于图结构的存储. 基 ...

  4. 知识图谱和neo4j的基本操作

    一.知识图谱的简介 1.知识图谱是什么 知识图谱本质上是语义网络(Semantic Network)的知识库 可以理解为一个关系图网络. 2.什么是图 图(Graph)是由节点(Vertex)和边(E ...

  5. 1. 通俗易懂解释知识图谱(Knowledge Graph)

    1. 通俗易懂解释知识图谱(Knowledge Graph) 2. 知识图谱-命名实体识别(NER)详解 3. 哈工大LTP解析 1. 前言 从一开始的Google搜索,到现在的聊天机器人.大数据风控 ...

  6. 2. 知识图谱-命名实体识别(NER)详解

    1. 通俗易懂解释知识图谱(Knowledge Graph) 2. 知识图谱-命名实体识别(NER)详解 3. 哈工大LTP解析 1. 前言 在解了知识图谱的全貌之后,我们现在慢慢的开始深入的学习知识 ...

  7. 知识图谱推理与实践 (2) -- 基于jena实现规则推理

    本章,介绍 基于jena的规则引擎实现推理,并通过两个例子介绍如何coding实现. 规则引擎概述 jena包含了一个通用的规则推理机,可以在RDFS和OWL推理机使用,也可以单独使用. 推理机支持在 ...

  8. 知识图谱辅助金融领域NLP任务

    从人工智能学科诞生之初起,自然语言处理(NLP)就是人工智能核心的研究问题之一.NLP的重要性是毋庸置疑的,它能够实现以自然语言交流为特征的高级人机交互,使机器能“阅读”所有以文字形式记录的人类知识, ...

  9. ISWC 2018概览:知识图谱与机器学习

    语义网的愿景活跃且良好,广泛应用于行业 语义网的愿景是「对计算机有意义」的数据网络(正如 Tim Berners Lee.James Hendler 和 Ora Lassila 在<科学美国人& ...

随机推荐

  1. django之初建项目

    一.项目预览 1.在创建项目之前,必须先进入虚拟环境,因为我们的包安装在我们的虚拟环境中,不在我们的中环境中 >>> ./venv/Scripts/activate 2.创建一个项目 ...

  2. 一文搞懂JVM内存结构+GC

    一.jvm是干什么的? 大家都知道java是跨平台语言,一次编译可以在不同操作系统上运行,怎么做到的呢,看下图: javac把写的源代码(java文件),编译成字节码(class文件),字节码部署到l ...

  3. Spring事务Transactional和动态代理(一)-JDK代理实现

    系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transa ...

  4. 曹工说Spring Boot源码(22)-- 你说我Spring Aop依赖AspectJ,我依赖它什么了

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  5. SQL Server 最小日志记录

    SQL Server之所以记录事务日志,首要目的是为了把失败或取消的操作还原到最原始的状态,但是,并不是所有的操作都需要完全记录事务日志,比如,在一个空表上放置排他锁,把大量的数据插入到该空表中.即使 ...

  6. html/css系列-图片上下居中

    本文详情:http://www.zymseo.com/276.html图片上下居中的问题常用的几种方法:图片已知大小和未知大小,自行理解 .main{ width: 400px;height: 400 ...

  7. SpringBoot学习笔记(一)入门简介

    一.SpringBoot 入门简介 整体讲解内容概况: 1.1 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案. Spring Boot ...

  8. DUBBO 面试灵魂18问

    一.Dubbo 是什么 dubbo 是一个分布式框架,是一个远程服务调用的分布式框架,其核心部分包含: 1)集群容错: 提供基于接口方法的透明远程过程调用,包含多协议支持,以及软负债均衡.失败容错.地 ...

  9. GPS授时器简介

    GPS授时器简介 GPS是全球定位系统的简称.GPS定位卫星在全球范围内进行定位.导航的系统.GPS所具有的全天候.高精度和自动测量的特点,已经融入到国民经济建设.国防建设和社会发展的各个领域.而在授 ...

  10. docker学习之路

    环境 : ubuntu 16.4 下载docker 首先使用命令行下载 docker wget -qO- https://get.docker.com/ | sh 启动 下载完成之后进行一个启动,但是 ...