0%

Neo4j的认知与学习

最近接触了知识图谱,并开始学习了Neo4j作为知识图谱的工具入门

什么是知识图谱?

从一个简单的例子入手:在Google搜索引擎里输入“Who is the wife of Bill Gates?”,我们直接可以得到答案-“Melinda Gates”。这是因为我们在系统层面上已经创建好了一个包含“Bill Gates”和“Melinda Gates”的实体以及他俩之间关系的知识库。所以,当我们执行搜索的时候,就可以通过关键词提取(”Bill Gates”, “Melinda Gates”, “wife”)以及知识库上的匹配可以直接获得最终的答案。这种搜索方式跟传统的搜索引擎是不一样的,一个传统的搜索引擎它返回的是网页、而不是最终的答案,所以就多了一层用户自己筛选并过滤信息的过程。

这就是一种KBQA模式的知识图谱应用,所以知识图谱本质上就是语义网络的知识库,从实际应用的角度出发可以认为知识图谱就是多关系图。在知识图谱中,我们通常使用”实体”来表示图里的节点、用”关系”表示图中边。

如何建立知识图谱

在建立知识图谱中我们选取的工具是Neo4j图形数据库,在建立知识图谱中最为关键的点在于:设定关系。有别于传统的关系型数据库,图数据库中一切基于关系。

图数据库和传统关系型数据库的区别

传统的关系型数据库在设计时都应该满足三范式


回顾一下三范式

第一范式:确保每列的原子性

第二范式:确保表中每个字段都和主键有关

第三范式:确保每列都和主键直接相关而不是间接相关


而在图数据库中每一个节点有自己的key-value属性,一群相同属性的节点就构成了label(标签),节点和节点之间通过关系相连接,relationship(关系)也有自己的key-value属性,同时在图数据中所有关系都是有向的。

将图数据库与传统关系型数据库比较可以认为,关系型数据库中的实体表就是图数据库中label,实体表中的每一条记录对应着图数据库中的一个节点,关系型数据库表与表之间的join关系就是图数据库中的relationship。

Neo4j的使用

将关系型数据库数据转移到Neo4j中

转移数据,我们使用的是Neo4j ETL 工具,它支持通过jdbc连接不同类型的数据库,将数据库中表导入Neo4j中,同时它可以自动判别关系型数据库中表与表的join关系,并在Neo4j中将其转化为relationship。

但是在使用Neo4j ETL 工具时有几点需要注意:

  • 千万别在Windows上操作!!! 由于Neo4j只支持以csv格式大批次导入数据,所以Neo4j ETL在本质上还是将关系型数据库中的表转为csv缓存在本地,然后在将csv导入Neo4j中,问题就出现在缓存这一步上,数据一旦在Windows上落地,Windows就会将UTF-8格式的数据转为UTF-8+BOM格式数据,也就是加了三个空字符,UTF-8+BOM的编码格式数据在导入Neo4j时会出现乱码。
  • Neo4j ETL在做表与表之间关系处理上,是不会辨别关系方向的,很多时候关系方向是乱的,而在图数据中关系方向很重要,所以不建议使用表与表之间的join在图数据库中建立关系,还是要手动建立关系,指明方向。

一些常用的cypher语句

删除关系,删除节点

MATCH (n:BC_Person)-[r]-() DELETE n,r

创建关系

match (a:LastSiteHangjiang),(b:PersonMessage) where a.lastType = “写字楼” create (a)-[r:is_contain]->(b) return r

查询关系

match p=(PersonMessage)-[r:is_contain]->() return p