知识图谱:小小的入门级综合应用
文章目录
- 导读
- 背景介绍
- 开始从零搭建知识图谱所需的环境
- 大前提
- 想法
- 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.5Microsoft 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安装
这个就直接参考我之前的安装博客,不再赘述啦。
点我查看Windows
版Docker
安装
点我查看Ubuntu
版Docker
安装
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
给出的知识图谱。
看起来还不错!
是不是有点能理解了呢?
知识图谱:小小的入门级综合应用相关推荐
- 知识图谱发展的三个时期以及事理图谱概念辨析
一.知识图谱发展三个周期 知识图谱,从2012年谷歌正式将这一概念应用到工业界之后,到现在已经逐步走过了将近7年的时间,在这七年的时间里,知识图谱逐步经历了从概念兴起.概念泛化.技术挣扎与落地尴尬三个 ...
- 图谱实战 | 李翔:美团到店综合知识图谱的构建与应用
转载公众号 | DataFunTalk 分享嘉宾:李翔 美团 算法专家 编辑整理:王惠灵 合肥工业大学 出品平台:DataFunTalk 导读:美团到店综合业务涵盖了本地生活中的休闲玩乐.丽人.亲子. ...
- 【实践】美团到店综合业务场景下的知识图谱构建与应用实践.pdf(附下载链接)...
猜你喜欢 0.[免费下载]2021年12月热门报告盘点1.如何搭建一套个性化推荐系统?2.快手推荐系统精排模型实践.pdf3.全民K歌推荐系统算法.架构及后台实现4.微博推荐算法实践与机器学习平台演进 ...
- 业界分享 | 美团到店综合知识图谱的构建与应用
美团到店综合业务涵盖了本地生活中的休闲玩乐.丽人.亲子.结婚.宠物等多个行业.为了不断提升到店综合业务场景下的供需匹配效率,美团深入挖掘用户在本地生活中的多样化需求,构建了以用户需求节点为中心并链接商 ...
- 实时数仓+知识图谱综合解决方案-首款图数仓AbutionGraph的行业落地报告PPT
AbutionGraph是北京图特摩斯科技研发的一款物联网级的大数据通用图数据库,使知识图谱技术不仅仅局限与关联关系存储的场景,我们可以把其应用到金融风控.车联网.智慧城市(传感器采集监控)等等要求高 ...
- 知识图谱实体链接是什么?一份“由浅入深”的综述
作者 | 尼古拉·瓦砾 来源 | Paperweekly(ID:paperweekly) [导读]这个世界充斥着无数的结构化数据(wiki)和非结构化数据(web),然而,如何将两者有效地集成仍然是个 ...
- 肖仰华:知识图谱构建的三要素、三原则和九大策略 | AI ProCon 2019
演讲嘉宾 | 肖仰华(复旦大学教授.博士生导师,知识工场实验室负责人) 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 近两年,知识图谱技术得到了各行各业的关注,无论是企业公 ...
- 今晚8点开播 | 深度解析知识图谱发展关键阶段技术脉络
作为知识图谱领域形成过程的亲历者之一,AI科技大本营此次邀请到文因互联 CEO 鲍捷,他将对知识图谱的历史渊源进行梳理,对该领域几次发展的主要技术突破做深度解析,并分析其工业落地的几个关键点.欢迎大家 ...
- 在刚刚结束的ACL 2019上,知识图谱领域都发生了哪些大事?
来源:机器之心 本文约6500字,建议阅读10分钟. 本文将介绍本届 ACL 收录的一些知识图谱方向的优秀成果,希望对读者们有所启发. [ 导读 ]对知识工程的研究贯穿于整个人工智能的发展史.作为目前 ...
最新文章
- idea mybatis generator插件_Mybatis使用自定义插件去掉POJO的Getter和Setter方法
- 160个Crackme019
- 5 分钟掌握 Python 中常见的配置文件
- 网络编程第三讲UDP编写
- web前端CSS2学习2017.6.22
- Hive 大小表关联查询异常
- 第1章 IO流概述及FileWriter类使用
- xCode 安装Mobile Device Framework出错的问题的解决方法
- 年薪十万的王者荣耀,LOL游戏模型师的工作是这样的|附50G资料
- SQL Server事务、视图和索引
- yolov5s 目标检测模型实战——火点烟雾检测实战
- 14套黑马程序员课程打包【资料全部完整】
- 现代OpenGL教程 01 - 入门指南
- 安装深度linux系统卡住不动,简单有效!一招解决深度Linux死机问题
- 计算机ps一级知识点,2018年全国计算机一级Photoshop考什么内容?
- 08-微信公众号素材管理
- 个人任务管理系统-数据库
- 状态机思路在嵌入式开发中的应用说明及注意事项(普罗米修斯中不少功能节点用了状态机的方法来写)
- python panda3d从入门_panda3d入门
- 数据采集 - 笔记 2
热门文章
- 全国计算机从业人数,我国的物流从业人员为5012万,占全国就业人数的6.5%
- nginx-rtmp搭建流媒体服务器实践
- Robotframework 的简介及其工作原理~
- 1.3 防火墙通过TELNET登录设备
- React 的设计理念(React 哲学)
- 全国大学生智能汽车竞赛硬件设计指南
- Php均方根标准差,方差(variance)、标准差(Standard Deviation)、均方差、均方根值(RMS)、均方误差(MSE)、均方根误差(RMSE)...
- 左耳听风ARTS第2周
- INS/GNSS组合导航(三)松耦合、紧耦合、深度耦合
- c语言volte变量,通信人来告诉你:什么是VoLTE