部署农业知识图谱开源项目

前言

项目是上海市《农业信息服务平台及农业大数据综合利用研究》子课题《上海农业农村大数据共享服务平台建设和应用》的研究成果。

该课题是由上海市农业委员会信息中心主持,以“致富农民、服务市民、提高行政管理效能”为目标,充分发挥大数据在农业农村发展中的重要功能和巨大潜力,重点建设上海市级农业农村大数据中心,促进信息资源的共建共享和创新应用。

华东师范大学数据科学与工程学院(以下简称华师大数据学院)作为课题主要参与单位以实现智慧农业为目标,探索农业大数据分析、挖掘和综合应用。华师大课题组在前期国家重点研发计划《大数据知识工程基础理论及其应用研究》研究基础上,在本项目中,基于碎片化农业大数据,构建面向智慧农业的知识图谱及其应用系统。

项目地址见:https://github.com/qq547276542/Agriculture_KnowledgeGraph

本文介绍整个项目的部署过程,记录和总结部署过程中存在的问题。

1. 环境准备

  1. 创建python虚拟环境
conda create -n kg python=3.6

  1. 激活环境
conda activate kg

退出环境(可选)

conda deactivate

2. 安装依赖包

cd至项目根目录,有一个requirement.txt。requirement.txt文件里面记录了当前程序运行所需要的所有安装包和其版本号,作用是方便程序在其他机器上重新构建项目安装所有依赖。

打开requirement.txt文件可以看到里面需要安装的包:

Cython>=0.28.5
Django>=1.11.7
thulac>=0.1.2
py2neo4.1.0
pyfasttext
0.4.5
pinyin>=0.4.0
pymongo>=3.6.1

requirement.txt的使用方式如下所示,即可自动下载requirement 中的安装包。

pip install -r requirement.txt

但需要注意的是我在安装过程中发现使用上述方式安装pyfasttext 安装失败。

参考这篇文章:https://pypi.org/project/pyfasttext/
首先直接安装cysignals和pyfasttext.

pip install cysignals
pip install pyfasttext

然后修改requirement.txt ,删除掉已经安装的pyfasttext. 再安装安装命令

pip install -r requirement.txt

3. 安装Jdk1.8

下载 Java
Java 8 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

解压
tar -xzvf jdk-8u131-linux-x64.tar.gz

配置环境变量
这里通过修改/etc/project文件来配置环境变量

vim /etc/project

在文件末尾添加如下信息

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

执行以下命令,使之生效

source /etc/profile

检查 Java 版本

java -version

4. 安装neo4j

下载
从官网下载neo4j 的3.5.2版本,下载地址为neo4j社区版
注意: neo4j 4.1版本要求jdk11 ,neo4j 3.5版本要求jdk8。 所以neo4j 选择3.5的版本。

解压

tar zxvf neo4j-community-3.5.22-unix.tar.gz

修改目录

mv neo4j-community-3.5.22 neo4j

配置环境变量

vi /etc/profile

添加:

export NEO4J_HOME=/opt/neo4j
export PATH=$PATH:$NEO4J_HOME/bin

执行以下命令,使之生效

source /etc/profile

修改配置文件

vi /etc/security/limits.conf

neo4j soft nofile 40000
neo4j hard nofile 40000

vi /opt/neo4j/conf/
#设置远程访问
dbms.connectors.default_listen_address=0.0.0.0
#设置数据库名称
dbms.active_database=agriculture_kg.db

启动服务

neo4j start

查看状态

neo4j status

停止服务

neo4j stop

导入数据(这部分内容和Github中Readme文件一样)

将hudong_pedia.csv导入neo4j:开启neo4j,进入neo4j控制台。将hudong_pedia.csv放入neo4j安装目录下的/import目录。在控制台依次输入:

// 将hudong_pedia.csv 导入
LOAD CSV WITH HEADERS  FROM "file:///hudong_pedia.csv" AS line  
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})  

// 新增了hudong_pedia2.csv
LOAD CSV WITH HEADERS  FROM "file:///hudong_pedia2.csv" AS line  
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})  
// 创建索引
CREATE CONSTRAINT ON (c:HudongItem)
ASSERT c.title IS UNIQUE

以上两步的意思是,将hudong_pedia.csv导入neo4j作为结点,然后对titile属性添加UNIQUE(唯一约束/索引)

(如果导入的时候出现neo4j jvm内存溢出,可以在导入前,先把neo4j下的conf/neo4j.conf中的dbms.memory.heap.initial_size 和dbms.memory.heap.max_size调大点。导入完成后再把值改回去)

进入/wikidataSpider/wikidataProcessing中,将new_node.csv,wikidata_relation.csv,wikidata_relation2.csv三个文件放入neo4j的import文件夹中(运行relationDataProcessing.py可以得到这3个文件),然后分别运行

// 导入新的节点
LOAD CSV WITH HEADERS FROM "file:///new_node.csv" AS line
CREATE (:NewNode { title: line.title })

//添加索引
CREATE CONSTRAINT ON (c:NewNode)
ASSERT c.title IS UNIQUE

//导入hudongItem和新加入节点之间的关系
LOAD CSV  WITH HEADERS FROM "file:///wikidata_relation2.csv" AS line
MATCH (entity1:HudongItem{title:line.HudongItem}) , (entity2:NewNode{title:line.NewNode})
CREATE (entity1)-[:RELATION { type: line.relation }]->(entity2)

LOAD CSV  WITH HEADERS FROM "file:///wikidata_relation.csv" AS line
MATCH (entity1:HudongItem{title:line.HudongItem1}) , (entity2:HudongItem{title:line.HudongItem2})
CREATE (entity1)-[:RELATION { type: line.relation }]->(entity2)

导入实体属性(数据来源: 互动百科)

将attributes.csv放到neo4j的import目录下,然后执行

LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:HudongItem{title:line.Entity}), (entity2:HudongItem{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);
                                                            
LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:HudongItem{title:line.Entity}), (entity2:NewNode{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);
                                                            
LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:NewNode{title:line.Entity}), (entity2:NewNode{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);
                                                            
LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:NewNode{title:line.Entity}), (entity2:HudongItem{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2)  

//我们建索引的时候带了label,因此只有使用label时才会使用索引,这里我们的实体有两个label,所以一共做2*2=4次。当然,可以建立全局索引,即对于不同的label使用同一个索引
                                                            
          
                                                                                                                         

导入气候名称:

将wikidataSpider/weatherData/static_weather_list.csv放在指定的位置(import文件夹下)

//导入节点
LOAD CSV WITH HEADERS FROM "file:///static_weather_list.csv" AS line
MERGE (:Weather { title: line.title })

//添加索引
CREATE CONSTRAINT ON (c:Weather)
ASSERT c.title IS UNIQUE

导入气候与植物的关系


将wikidataSpider/weatherData/weather_plant.csv放在指定的位置(import文件夹下)
//导入hudongItem和新加入节点之间的关系
LOAD CSV  WITH HEADERS FROM "file:///weather_plant.csv" AS line
MATCH (entity1:Weather{title:line.Weather}) , (entity2:HudongItem{title:line.Plant})
CREATE (entity1)-[:Weather2Plant { type: line.relation }]->(entity2)
导入城市的气候

将city_weather.csv放在指定的位置(import 文件夹下)
(这步大约需要15分钟左右)
//导入城市对应的气候
LOAD CSV WITH HEADERS FROM "file:///city_weather.csv" AS line
MATCH (city{title:line.city}) , (weather{title:line.weather})
CREATE (city)-[:CityWeather { type: line.relation }]->(weather)

以上步骤是导入爬取到的关系

2.下载词向量模型:(如果只是为了运行项目,步骤2可以不做,预测结果已经离线处理好了)

http://s3-us-west-1.amazonaws.com/fasttext-vectors/wiki.zh.zip
将wiki.zh.bin放入 KNN_predict 目录 。

3.修改Neo4j用户

进入demo/Model/neo_models.py,修改第9行的neo4j账号密码,改成你自己的

4.启动服务

进入demo目录,然后运行脚本:

sudo sh django_server_start.sh

这样就成功的启动了django。我们进入8000端口主页面,输入文本,即可看到以下命名实体和分词的结果(确保django和neo4j都处于开启状态)

你可能感兴趣的:(算法,知识图谱,自然语言处理)