项目是上海市《农业信息服务平台及农业大数据综合利用研究》子课题《上海农业农村大数据共享服务平台建设和应用》的研究成果。
该课题是由上海市农业委员会信息中心主持,以“致富农民、服务市民、提高行政管理效能”为目标,充分发挥大数据在农业农村发展中的重要功能和巨大潜力,重点建设上海市级农业农村大数据中心,促进信息资源的共建共享和创新应用。
华东师范大学数据科学与工程学院(以下简称华师大数据学院)作为课题主要参与单位以实现智慧农业为目标,探索农业大数据分析、挖掘和综合应用。华师大课题组在前期国家重点研发计划《大数据知识工程基础理论及其应用研究》研究基础上,在本项目中,基于碎片化农业大数据,构建面向智慧农业的知识图谱及其应用系统。
项目地址见:https://github.com/qq547276542/Agriculture_KnowledgeGraph
本文介绍整个项目的部署过程,记录和总结部署过程中存在的问题。
conda create -n kg python=3.6
conda activate kg
退出环境(可选)
conda deactivate
cd至项目根目录,有一个requirement.txt。requirement.txt文件里面记录了当前程序运行所需要的所有安装包和其版本号,作用是方便程序在其他机器上重新构建项目安装所有依赖。
打开requirement.txt文件可以看到里面需要安装的包:
Cython>=0.28.5
Django>=1.11.7
thulac>=0.1.2
py2neo4.1.0
pyfasttext0.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
下载 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
下载
从官网下载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
将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都处于开启状态)