目录
a)添加系统变量 CLASS_PATH 和 JAVA_HOME
说明:本文前两节提到的 Java 和 neo4j 的安装包可以通过如下链接免费下载:
一、安装 Java 环境
1、下载 Java 包并解压到指定目录下
子目录如下图所示:
2、配置环境变量
a)添加系统变量 CLASS_PATH 和 JAVA_HOME
b) 在已有的系统变量 Path 中添加(新建)环境变量
根据自己的 jdk 所在目录添加,我的操作如下图所示:
3、测试 java 环境
win + R 输入 “cmd” 回车,输入 java -version,如下图所示:
如果看到版本信息,说明环境配置成功。
二、安装 Neo4j-3.5.5
1、下载 neo4j 软件包并解压到指定目录下
子目录如图所示:
2、配置环境变量
a)添加系统变量 NEO4J_HOME
b) 在已有的系统变量 Path 中添加(新建)环境变量
3、测试 neo4j 服务是否可以正常开启
win + R 输入 “cmd” 回车,输入 neo4j.bat console,如下图所示则说明一路安装正确:
注意:此终端(服务)不要关闭,否则不能访问 Neo4j 图数据库系统
4、访问 Neo4j 图数据库系统
访问后,显示以下界面,说明此小节以上工作全部成功完成:
当连接成功的同时,终端也发生变化:
我们输入默认登录密码 neo4j ,点击 Connect,跳出更改密码的界面,如下图所示:
更改后,就成功进入主界面,如下图所示:
三、使用 Neo4j 数据库并可视化(网络安全)知识图谱
1、使用示例数据库
点击左侧边栏的小星星,再点击 Example Graph --> Movie Graph,界面如下:
点击右侧的执行按钮,显示以下界面:
明显这是一个电影相关的图数据库,我们使用给定的查询命令试一试:
点击执行,这样我们就图数据库中查询到我们想要的结果的可视化结果,如下图所示,我们也可以得到表或代码等形式的返回结果,大家可以自行尝试:
其他命令大家可以自行尝试...
2、生成我们自己的 CSV 数据,并为文件导入配置环境
a)构建并生成我们的数据(节点文件和边文件)
需要两个文件,一个是 entity.csv(数据格式:e1,兔子,my_entity)(节点文件),一个是 triples.csv(数据格式:e1,e2,爱吃)(边文件,因为边不能脱离实体存在,所以这个文件中既有实体,也有关系),可以用下面这段代码,替换数据集(训练集、验证集和测试集;它们的数据格式:兔子 胡萝卜 爱吃 )及上述两个目标文件的路径,用下面代码可以直接生成:
import csv
# 把每一行的实体加入列表进行编号(e1,e2,e3...),并存入字典
entity_dic = {}
# 为实体计数, 从 0 开始
ent_count = 0
def read_dataset(ds_path):
"""
输入:数据集的路径
返回:数据集中的数据构成的列表
"""
ds_list = []
with open(ds_path, 'r', encoding='UTF-8') as f:
reader = csv.reader(f)
lines = [row for row in reader]
for item in lines:
temp = []
item = item[0].split("\t")
temp.append(item[0])
temp.append(item[1])
temp.append(item[2])
ds_list.append(temp)
f.close()
return ds_list
# 训练集、验证集和测试集的数据格式:兔子 胡萝卜 爱吃
train_data = read_dataset('D:/TSEE/datasets/neo4j_data/train.txt')
valid_data = read_dataset('D:/TSEE/datasets/neo4j_data/valid.txt')
test_data = read_dataset('D:/TSEE/datasets/neo4j_data/test.txt')
# 叠加三个数据集,用于后边对所有实体的编号
all_data = train_data + valid_data + test_data
def generate_entity_csv():
"""
输出:entity.csv文件(即实体与编号的对应文件)
数据格式:e1,兔子,my_entity
e2,胡萝卜,my_entity
"""
# 使用global关键字,在执行函数时,可以更改全局变量,防止再次创建同名的局部变量
global ent_count
for item in all_data:
if item[0] not in entity_dic.keys():
entity_dic[item[0]] = "e" + str(ent_count)
ent_count += 1
if item[1] not in entity_dic.keys():
entity_dic[item[1]] = "e" + str(ent_count)
ent_count += 1
with open('D:/TSEE/datasets/neo4j_data/entity.csv', 'w', encoding='utf-8') as o:
# print(item_dic)
o.write("entity:ID"+",")
o.write("name"+",")
o.write(":LABEL"+"\n")
for item in entity_dic:
# print(item)
o.write(entity_dic[item] + ",")
o.write(item + ",")
o.write("my_entity" + "\n")
o.close()
def generate_triples_csv():
"""
输出:triples.csv文件(即所有三元组数据)
数据格式:e1,e2,爱吃
"""
triples = []
for item in all_data:
temp_list = []
temp_list.append(entity_dic[item[0]])
temp_list.append(entity_dic[item[1]])
temp_list.append(item[2])
triples.append(temp_list)
with open("D:/TSEE/datasets/neo4j_data/triples.csv", 'w', encoding='utf-8') as o:
o.write(":START_ID" + ",")
o.write(":END_ID" + ",")
o.write(":TYPE" + "\n")
for item in triples:
o.write(str(item[0]) + ",")
o.write(str(item[1]) + ",")
o.write(str(item[2]) + "\n")
o.close()
generate_entity_csv()
generate_triples_csv()
最终两个文件(数据的部分截图)如下图所示,其中第一行边的类型千万别忘了加(不管你是用脚本构造或者是手动创建)。如果忘加,Neo4j 不能有效识别文件,就会直接报错:
entity.csv 文件(节点文件):
triples.csv 文件(边文件):
b)为文件的导入配置环境
1)把如下图所示的默认的数据库,也就是 graph.db 目录给删掉:
2)打开如下我展示的目录下的文件:
如下图所示,把 dbms.active_database=graph.db 这一行的 “#” 去掉;
并将 graph.db 更为任意名,我起的名字是 zax.db(不更改也可以,但上一步的 graph.db 目录删掉,要不然影响要导入自己数据所执行的命令的运行):
3、使用 neo4j 可视化(网络安全)知识图谱
关闭 neo4j 的运行窗口,再在 D:\neo4j-community-3.5.5\bin 下右键打开终端,执行以下命令:
.\neo4j-import.bat --into D:\\neo4j-community-3.5.5\\data\\databases\\zax.db --id-type string --nodes D:\\neo4j-community-3.5.5\\entity.csv --relationships D:\\neo4j-community-3.5.5\\triples.csv
如图所示:
可以看到我们的两个 csv 文件已经成功导入,我们再重新打开 neo4j 服务,如下:
进入界面,点击左侧边栏的数据库图标,可以看到,我们已经成功可视化(网安)知识图谱:
大家也可以根据自己的数据来可视化知识图谱...
附录
一、Neo4j 简介及其数据结构
Neo4j是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。简单来说Neo4j是一个开源的基于Java开发,运行于JVM之上。
在一个图中包含两种基本的数据类型:Nodes(节点) 和 Relationships(关系)。Nodes 和 Relationships 包含key/value形式的属性。Nodes通过 Relationships 所定义的关系相连起来,形成关系型网络结构。
二、关系型数据库和非关系型数据库
1. 关系型数据库
关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。主流的关系型数据库有Oracle、DB2、MySQL、SQL Server等。推荐了解java中级程序员学习线路图。
2. 非关系型数据库
非关系型数据库,也称为NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。常见的非关系型数据库按照分类有:
键值(Key-Value): Redis、Memcached、Oracle BDB
列存储数据库:Cassandra、HBase、 Riak
文档型数据库:MongoDB、SequoiaDB
图形数据库:Neo4J、JanusGraph、TigerGraph
其中上述一、二节摘自:
什么是Neo4j?如何通过Neo4j构建《人民的名义》的关系图谱?
因此我们也可以在 Neo4J 中使用 NoSQL 命令创建结点和关系,直接可视化知识图谱:
NoSQL 简介 | 菜鸟教程NoSQL 简介 NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”。 在现代的计算系统上每天网络上都会产生庞大的数据量。这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 1970年 E.F.Codd’s提出的关系模型的论文 'A relational model of data for large shared data banks”,这使得数据建模和应用程序编程更加简单。通..https://www.runoob.com/mongodb/nosql.html当然,这也只是在数据量较小的情况下才可行,如果构建大型知识图谱,还得像我们之前那样,通过导入的方式来可视化知识图谱。
补充:WARN The client is unauthorized due to authentication failure. 错误的解决办法:
描述:当你导入其他数据库(如A.db)后,再导入另一个数据库(如B.db),并可视化后,你更改B 的图谱上的节点颜色或大小改不了,会在命令窗口报这个错,也就是授权问题。
我的理解:A 数据库在可视化图谱后,你的操作会保存在一个配置文件中(具体是哪个文件没必要管)。但当你可视化 B 数据库时,就会导入 A 的配置,当你针对 B 的图谱修改时,就对这个配置文件的内容作出了修改,但这没有经过 A 的允许 ,就会报错
解决办法:到 D:\neo4j-community-3.5.5\conf 目录下修改 neo4j.conf 文件
去掉 下面这行 的 “ # ”,保证不进行任何授权验证