文章目录

  • 导读
  • 背景介绍
  • 开始从零搭建知识图谱所需的环境
    • 大前提
    • 想法
    • Docker安装
    • Neo4j安装
      • 1、拉取镜像
      • 2、准备`docker-compose.yml`文件
      • 3、启动
      • 4、访问
      • 5、Python包
      • 问题分析
  • 编码实现
    • 全域变量配置
    • 数据读取
    • 创建节点
    • 创建关系
  • 整合
  • 最后给个主函数
  • 运行

导读

本篇文章转载自Voyager-m的博客:知识图谱-用python操纵neo4j数据库-以高速收费站记录为例。已获得原文作者转载许可。本篇与原篇的区别其实只是在一些循环的代码上进行了简化,让看起来很传统的代码缩减了很多。

背景介绍

让我们来想像这样一个场景:

突然有一天,国家突然要查这段高速公路在这段时间内的收费情况,包括车辆租赁车辆通行等等的数据,然后经过抽样调查就查到了我们现在需要进行学习的数据:点击这里跳转到GitHub查看数据源。如果你需要,请放心下载,这些都是开源的。

开始从零搭建知识图谱所需的环境

好的,最耗时间的数据集准备已经结束了。我们直接开始吧。

因为并不知道人家查证是怎么查,所以这里就随便构建一下,说明一下构建的过程就够了。我们的目的是学习方法,不是抓犯人

为了能够让所有的人都能够上手,我们就从一台光秃秃的电脑开始。

大前提

先说明一下,我使用的环境是:

  • Ubuntu 20.04 20.04 20.04系统
  • Python 3.8.5 3.8.5 3.8.5
  • Microsoft Visual Studio 1.52.1 1.52.1 1.52.1+Python拓展包
  • neo4j 4.2.1 4.2.1 4.2.1

想法

为了简化部署过程,这里就使用Docker部署neo4j,减少很多本地配置的坑。后来经过实践发现,Docker Hub里面的官方镜像并没有内置Vim或者Vi,而且apt命令执行得究极无敌棒槌慢,所以,尽量不要进入Docker修改配置。

Docker安装

这个就直接参考我之前的安装博客,不再赘述啦。

点我查看WindowsDocker安装

点我查看UbuntuDocker安装

Neo4j安装

既然是什么都方便的Docker,那么自然步骤就是:

1、拉取镜像

docker pull neo4j

2、准备docker-compose.yml文件

为了方便,我就在本机部署的,于是放在了/usr/local/docker/neo4j这个目录下

# 以下配置可以兼容2.7到3.5的所有版本
version: '3.3'
# 服务
services:# neo4j服务neo4j:# 镜像来源image: 'neo4j'# 随着我的物理机的重启而重启restart: always# 使用exec命令进去后显示的主机名称hostname: 'Neo4j-11xx'# 在物理机的docker列表中显示名称container_name: 'neo4j_11xx'# 开启的端口ports:# 管理界面访问端口- '1174:7474'# 数据传输端口- '1187:7687'# 磁盘映射volumes:- /usr/local/docker/neo4j/data:/data

3、启动

docker-compose up -d

4、访问

打开浏览器虽然知道是废话,但还是叮嘱一句:Windows用户别用IE打开

然后访问http://localhost:1174这个网址(我们刚刚在docker-compose.yml中开启的是这个端口)。

初始用户名是neo4j,初始密码是neo4j,初始数据库是neo4j。不写是哪个数据库将会默认进入neo4j数据库。对于小白来说,保持空白就好了。

5、Python包

在物理机内,Windows用户可能需要使用Git Bash窗口进行包的安装,而Ubuntu直接使用Ctrl+Alt+T呼出终端安装,命令都是一样的:

pip3 install py2neo

这里就做一回强迫症,直接下最新的,别考虑最早支持的版本。

问题分析

  • 如果网址进不去,先考虑是不是端口号输错了,比如明明你从 1174 1174 1174端口能够打开登录界面,却在登录界面使用 7474 7474 7474端口访问数据库。这就像是明明知道你得的是感冒却拿了一瓶跌打油
  • 接着再考虑一下是不是镜像选错了。虽然Docker Hub中的镜像很多,但还是尽量使用官方镜像因为有足够丰富的文档支撑

编码实现

好了,到这里,环境搭完了,我们就开始吧。

全域变量配置

# 配置类
class CONFIG(enumerate):# Neo4j访问地址URL = 'http://localhost:1174'# 用户名USERNAME = 'neo4j'# 密码PASSWORD = 'ljx62149079'# xls文件路径XLS = os.getcwd() + '/knowledge/data.xls'# csv文件路径CSV = os.getcwd() + '/knowledge/data.csv'pass

数据读取

还是老朋友pandas

# 数据导入类
class DataImporter:# 类构造器def __init__(self):# 直接从Excel里面读取所有的原生数据# self.raw_data = pd.read_excel(CONFIG.XLS)self.raw_data = pd.read_csv(CONFIG.CSV)# 将所有的数据提取到一维数组中(去重)self.all_data = list(# 使用集合去掉重复的set([# 将一维数组所有的数据化为字符串str(i) for i in list(# 将二维数组改为一维数组itertools.chain(# 根据列属性一一列出表格中所有的行数据*[item for item in self.raw_data[[# 列出所有的列属性column for column in self.raw_data.columns]].values]))]))# 所有的购买方(去重)self.buyer_list = list(set(self.raw_data['购买方名称']))# 所有的销售方(去重)self.seller_list = list(set(self.raw_data['销售方名称']))# 所有原生数据的映射self.dict = pd.DataFrame({# 所有的金额(原生)'finance': list(self.raw_data['金额']),# 所有的购买方(原生)'buyer': list(self.raw_data['购买方名称']),# 所有的销售方(原生)'seller': list(self.raw_data['销售方名称'])})'''别忘了加上neo4j数据库访问'''# 图数据库对象self.graph = Graph(CONFIG.URL,username=CONFIG.USERNAME,password=CONFIG.PASSWORD)# 清空缓存self.graph.delete_all()# 配对器self.matcher = NodeMatcher(self.graph)pass

创建节点

既然数据读取可以了,那么我们就可以继续在类里面添加方法:

class DataImporter:# 传入购买方、销售方数据def create_tree_node(self, buyers, sellers):for key in buyers: # 根据购买方创建节点self.graph.create(Node('buyer', name=key))passfor key in sellers: # 根据销售方创建节点self.graph.create(Node('seller', name=key))passpasspass

创建关系

class DataImporter:def create_nodes_relation(self):# 对于字典中所有的数据for item in range(0, len(self.dict)):try:self.graph.create(# 关系映射Relationship(self.matcher.match('buyer').where("_.name='" + self.dict['buyer'][item] + "'").first(),self.dict['finance'][item],self.matcher.match('seller').where("_.name='" + self.dict['seller'][item] + "'").first()))pass# 如果出错,显示错误。增强程序健壮性except AttributeError as ae:print(ae, item)passpasspasspass

整合

既然我们把零零碎碎的东西农好了之后,我们就开始整合:

# -*- coding: utf-8 -*-import pandas as pd
import itertools
import osfrom py2neo import Node, Graph, Relationship, NodeMatcher, data# 配置类
class CONFIG(enumerate):# Neo4j访问地址URL = 'http://localhost:1174'# 用户名USERNAME = 'neo4j'# 密码PASSWORD = 'ljx62149079'# xls文件路径XLS = os.getcwd() + '/knowledge/data.xls'# csv文件路径CSV = os.getcwd() + '/knowledge/data.csv'pass# 数据导入类
class DataImporter:# 类构造器def __init__(self):# 直接从Excel里面读取所有的原生数据# self.raw_data = pd.read_excel(CONFIG.XLS)self.raw_data = pd.read_csv(CONFIG.CSV)# 将所有的数据提取到一维数组中(去重),没用...# self.all_data = list(set([str(i) for i in list(itertools.chain(*[item for item in self.raw_data[[column for column in self.raw_data.columns]].values]))]))# 所有的购买方(去重)self.buyer_list = list(set(self.raw_data['购买方名称']))# 所有的销售方(去重)self.seller_list = list(set(self.raw_data['销售方名称']))# 所有原生数据的映射self.dict = pd.DataFrame({# 所有的金额(原生)'finance': list(self.raw_data['金额']),# 所有的购买方(原生)'buyer': list(self.raw_data['购买方名称']),# 所有的销售方(原生)'seller': list(self.raw_data['销售方名称'])})# 图数据库对象self.graph = Graph(CONFIG.URL,username=CONFIG.USERNAME,password=CONFIG.PASSWORD)# 清空缓存self.graph.delete_all()# 配对器self.matcher = NodeMatcher(self.graph)pass# 创建节点方法def create_tree_node(self, buyers, sellers):for key in buyers: # 根据购买方创建节点self.graph.create(Node('buyer', name=key))passfor key in sellers: # 根据销售方创建节点self.graph.create(Node('seller', name=key))passpass# 创建节点间关系def create_nodes_relation(self):# 对于字典中所有的数据for item in range(0, len(self.dict)):try:self.graph.create(Relationship(self.matcher.match('buyer').where("_.name='" + self.dict['buyer'][item] + "'").first(), self.dict['finance'][item], self.matcher.match('seller').where("_.name='" + self.dict['seller'][item] + "'").first()))pass# 如果出错,显示错误,增强程序健壮性except AttributeError as ae:print(ae, item)passpasspasspass

这段你可以在我的GitHub中下载

最后给个主函数

if __name__ == '__main__':# 数据导入类dataImpoter = DataImporter()# 创建实体节点dataImpoter.create_tree_node(dataImpoter.buyer_list, dataImpoter.seller_list)# 创建实体节点间的关系dataImpoter.create_nodes_relation()pass

运行

运行之后,啥都没有,就退出了。

你觉得失败了?当然没有,我们进入浏览器看看:http://localhost:1174,会发现一个界面:

在网址栏下面有个灰色的地方,有个淡淡的neo4j$得仔细看),我们在这里输入:

MATCH p=()-->() RETURN p LIMIT 25

点击正右端的三角形,也就是运行按钮;如果你想方便也可以按回车。于是能够看到:

这就是neo4j给出的知识图谱。

看起来还不错!

是不是有点能理解了呢?

知识图谱:小小的入门级综合应用相关推荐

  1. 知识图谱发展的三个时期以及事理图谱概念辨析

    一.知识图谱发展三个周期 知识图谱,从2012年谷歌正式将这一概念应用到工业界之后,到现在已经逐步走过了将近7年的时间,在这七年的时间里,知识图谱逐步经历了从概念兴起.概念泛化.技术挣扎与落地尴尬三个 ...

  2. 图谱实战 | 李翔:美团到店综合知识图谱的构建与应用

    转载公众号 | DataFunTalk 分享嘉宾:李翔 美团 算法专家 编辑整理:王惠灵 合肥工业大学 出品平台:DataFunTalk 导读:美团到店综合业务涵盖了本地生活中的休闲玩乐.丽人.亲子. ...

  3. 【实践】美团到店综合业务场景下的知识图谱构建与应用实践.pdf(附下载链接)...

    猜你喜欢 0.[免费下载]2021年12月热门报告盘点1.如何搭建一套个性化推荐系统?2.快手推荐系统精排模型实践.pdf3.全民K歌推荐系统算法.架构及后台实现4.微博推荐算法实践与机器学习平台演进 ...

  4. 业界分享 | 美团到店综合知识图谱的构建与应用

    美团到店综合业务涵盖了本地生活中的休闲玩乐.丽人.亲子.结婚.宠物等多个行业.为了不断提升到店综合业务场景下的供需匹配效率,美团深入挖掘用户在本地生活中的多样化需求,构建了以用户需求节点为中心并链接商 ...

  5. 实时数仓+知识图谱综合解决方案-首款图数仓AbutionGraph的行业落地报告PPT

    AbutionGraph是北京图特摩斯科技研发的一款物联网级的大数据通用图数据库,使知识图谱技术不仅仅局限与关联关系存储的场景,我们可以把其应用到金融风控.车联网.智慧城市(传感器采集监控)等等要求高 ...

  6. 知识图谱实体链接是什么?一份“由浅入深”的综述

    作者 | 尼古拉·瓦砾 来源 | Paperweekly(ID:paperweekly) [导读]这个世界充斥着无数的结构化数据(wiki)和非结构化数据(web),然而,如何将两者有效地集成仍然是个 ...

  7. 肖仰华:知识图谱构建的三要素、三原则和九大策略 | AI ProCon 2019

    演讲嘉宾 | 肖仰华(复旦大学教授.博士生导师,知识工场实验室负责人) 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 近两年,知识图谱技术得到了各行各业的关注,无论是企业公 ...

  8. 今晚8点开播 | 深度解析知识图谱发展关键阶段技术脉络

    作为知识图谱领域形成过程的亲历者之一,AI科技大本营此次邀请到文因互联 CEO 鲍捷,他将对知识图谱的历史渊源进行梳理,对该领域几次发展的主要技术突破做深度解析,并分析其工业落地的几个关键点.欢迎大家 ...

  9. 在刚刚结束的ACL 2019上,知识图谱领域都发生了哪些大事?

    来源:机器之心 本文约6500字,建议阅读10分钟. 本文将介绍本届 ACL 收录的一些知识图谱方向的优秀成果,希望对读者们有所启发. [ 导读 ]对知识工程的研究贯穿于整个人工智能的发展史.作为目前 ...

最新文章

  1. idea mybatis generator插件_Mybatis使用自定义插件去掉POJO的Getter和Setter方法
  2. 160个Crackme019
  3. 5 分钟掌握 Python 中常见的配置文件
  4. 网络编程第三讲UDP编写
  5. web前端CSS2学习2017.6.22
  6. Hive 大小表关联查询异常
  7. 第1章 IO流概述及FileWriter类使用
  8. xCode 安装Mobile Device Framework出错的问题的解决方法
  9. 年薪十万的王者荣耀,LOL游戏模型师的工作是这样的|附50G资料
  10. SQL Server事务、视图和索引
  11. yolov5s 目标检测模型实战——火点烟雾检测实战
  12. 14套黑马程序员课程打包【资料全部完整】
  13. 现代OpenGL教程 01 - 入门指南
  14. 安装深度linux系统卡住不动,简单有效!一招解决深度Linux死机问题
  15. 计算机ps一级知识点,2018年全国计算机一级Photoshop考什么内容?
  16. 08-微信公众号素材管理
  17. 个人任务管理系统-数据库
  18. 状态机思路在嵌入式开发中的应用说明及注意事项(普罗米修斯中不少功能节点用了状态机的方法来写)
  19. python panda3d从入门_panda3d入门
  20. 数据采集 - 笔记 2

热门文章

  1. 全国计算机从业人数,我国的物流从业人员为5012万,占全国就业人数的6.5%
  2. nginx-rtmp搭建流媒体服务器实践
  3. Robotframework 的简介及其工作原理~
  4. 1.3 防火墙通过TELNET登录设备
  5. React 的设计理念(React 哲学)
  6. 全国大学生智能汽车竞赛硬件设计指南
  7. Php均方根标准差,方差(variance)、标准差(Standard Deviation)、均方差、均方根值(RMS)、均方误差(MSE)、均方根误差(RMSE)...
  8. 左耳听风ARTS第2周
  9. INS/GNSS组合导航(三)松耦合、紧耦合、深度耦合
  10. c语言volte变量,通信人来告诉你:什么是VoLTE