码迷,mamicode.com
首页 > 其他好文 > 详细

neo4j

时间:2018-07-01 22:05:09      阅读:595      评论:0      收藏:0      [点我收藏+]

标签:管理   duration   不同   user   iter   密码   unity   row   art   

neo4j 数据库安装指南

1. 下载

进入 neo4j 官方网站的下载页面,根据所用操作系统,下载适当的版本。

因为企业版需要授权,因此可暂先下载社区版本,下面以 Linux 系统为例:

# 下载
$ wget https://neo4j.com/artifact.php?name=neo4j-community-3.4.1-unix.tar.gz

# 解压
$ tar zxvf ./neo4j-community-3.4.1-unix.tar.gz

2. 配置

下载并解压后得到的目录形如:

.
├── bin/
├── certificates/
├── conf/
├── data/
├── import/
├── lib/
├── logs/
├── plugins/
├── run/
├── LICENSES.txt
├── LICENSE.txt
├── NOTICE.txt
├── README.txt
└── UPGRADE.txt

2.1 配置环境变量

配置环境变量 NEO4J_HOME 值为该目录的地址。还可将 bin 目录加入 PATH

2.2 设置数据库服务的地址与端口

打开 conf/neo4j.conf 文件,找到下面内容:

# Bolt connector
dbms.connector.bolt.enabled=true
#dbms.connector.bolt.tls_level=OPTIONAL
#dbms.connector.bolt.listen_address=:7687  <---

# HTTP Connector. There must be exactly one HTTP connector.
dbms.connector.http.enabled=true
#dbms.connector.http.listen_address=:7474 <---

# HTTPS Connector. There can be zero or one HTTPS connectors.
dbms.connector.https.enabled=true
#dbms.connector.https.listen_address=:7473 <---

打开上面箭头所指行的注释,并在冒号前加上本机的 ip 地址,如改为 0.0.0.0:7687

3. 运行

运行 bin 目录下的 neo4j 命令。

$ sudo neo4j start

此时数据库系统已经启动了,如果遇到问题,可以查看 logs/ 中的日志文件,定位错误。

数据库启动成功后,可以在 Web 浏览器中,访问 http://host:port 对数据库中的内容进行查看。打开 Web 页面后需要输入用户名和密码,默认用户名和密码均为 neo4j,初次登陆时会强制修改密码。

neo4j 数据库建库指南

下面内容将指导如何准备数据,并将数据导入数据库中。

neo4j 图数据库核心概念介绍

在关系型数据库中,数据以元组构成表,表与表之间通过外键进行关联。而在 neo4j 图数据库中,数据以不同类型的节点存储,节点与节点通过关系相连。

技术分享图片

如上图中,存在 3 个节点,其中 2 个 Person 节点,1 个 Movie 节点。两类节点各自包含自身的数据,且 Person 节点和 Movie 节点通过 AVTED_INDIRECTED 来连接,这也表明了 Person 和 Movie 之间的关系,即节点通过关系相连。关系自身也可以包含属性,比如 ACTED_IN 中国包含了 roles 属性,指明 Person 在电影中饰演什么角色。

建库主体思路

在一个图数据库中,核心只有两个,即节点和关系。通常一个图数据库中会含有几类节点,和连接这几类节点的关系。neo4j 提供了向数据库中导入海量数据的工具 neo4j-admin import,该工具要求待导入数据以 csv 格式存储。

将不同节点的数据,以及连接这些节点的关系的数据分别存储在不同的 csv 文件中,neo4j 的导入工具通过读取这些文件,建立数据库。

具体操作方法可以参考 neo4j 提供的操作指南 - Use the Import tool,或者阅读下面的简化版操作指南。

建库方法

1. 数据准备

首先需要明确数据库中存在哪些节点类型。比如智联招聘的项目中,可能包含 求职者公司招聘公告简历 这四类节点。

而这四类节点会通过以下关系相连:

  • 求职者 --浏览--> 招聘公告
  • 求职者 --投递简历 --> 招聘公告
  • 求职者 --创建--> 简历
  • 招聘公告 --曝光(即被浏览)--> 求职者
  • 公司 --发布--> 招聘公告

正如前面所看到的的,每个节点和关系中可以包含额外的属性。而这些数据都通过 csv 文件存储。

在建立数据库之前,需要分析一下数据库中存在哪些节点,哪些节点类型,以及哪些节点之间需要建立关系,以及关系名是什么。并分别创建 csv 文件。

1.1 csv 文件的头部

如果了解 csv 文件的格式,就知道其内容中第一行记录了各列数据的属性名。在这里 neo4j 导入工具,对头部新增了一些要求。

其头部格式形如:

<field_name>:<field_type>,<field_name>:<field_type>,<field_name>:<field_type>

其中 field_name 指明了该列的属性名,冒号后面的 field_type 则指明了字段的类型,类型可以忽略,默认会使用 string 类型。

可选的类型如下:

int, long, float, double, boolean, byte, short, char,
string, point, date, localtime, time,localdatetime,
datetime, and duration

例如:

用户ID:string,简历编号:ID,简历ID,简历名称,性别,年龄:int
671801829,JM718018294R90250000000,244669658,医疗美容销售主管,男,28

1.2 节点数据

对于节点,需要有一个唯一的 id 来标识它,所以在节点信息对应的 csv 文件中需要有一个 ID 字段,且该字段的值要唯一。另外,还需要有一个指定它的类型,这通过 LABEL 字段指明。

举例如下 applicants.csv :

user_id:ID,age:int,gender:string,:LABEL
169905,27,‘女‘,求职者
169906,23,‘女‘,求职者

在记录求职者信息的 applicants.csv 文件中。使用了 user_id 作为 节点的 ID,因为 user_id 恰好是唯一的。包含另外两个属性,分别是 age 和 gender,其类型分别是 int 和 string。其中最后一列,用来指定节点的类型,所以没有使用 field_name 而是仅仅使用了 LABEL 作为 field_type

1.3 关系数据

一个关系最基本的要素包含:关系名、关系起点、关系终点。 即:

关系起点 -- 关系名 --> 关系终点

例如:

求职者 --浏览--> 招聘公告

在记录关系数据的 csv 文件的头部,需要指出三个必要信息:

  1. TYPE: 关系类型
  2. START_ID: 关系起始节点的 ID
  3. END_ID: 关系结束节点的 ID

例如 browse.csv:

user_id:START_ID,job_id:END_ID,:TYPE
169905,31223317124,浏览

START_ID 指出关系的起点,END_ID 指出关系的终点,而 TYPE 则指出关系名。这里的 START_IDEND_ID 的值则对应一个节点的 ID。

上面这一条数据,就给 id 为 169905 的用户和编号为 31223317124 的招聘公告之间建立了联系,并表明该用户浏览了该职位的信息。

2. 导入数据

针对海量数据的导入,neo4j 提供了命令行工具来完成导入,可执行文件为 <neo4j_home>/bin/neo4j-admin。其中 <neo4j_home> 为安装目录。

可以通过下面的命令导入数据:

$ neo4j-admin import \ 
    --nodes applicants.csv --nodes job.csv \ # 指定节点文件
    --relationships browse.csv --relationships deliver.csv  # 指定关系文件 

即通过 --nodes--relationships 选项,将结点和关系对应的 csv 文件传给导入工具。这里的文件名以及传入文件个数需要根据实际情况指定。

如果需要导入多个文件,那么命令行将会很长,为此我们提供了一个工具,通过编写配置文件,完成导入,以缓解输入很长的命令的麻烦。

3. 高级选项

3.1 属性值为数组

若需要导入的某个属性的值为数组,可在 <field_type> 后面跟上一个 [] 表示该属性的值为数组,数组中元素使用 ; 分隔。 如:

user_id:ID,keywords:string[],:LABEL
3214233,"C++";"Java",求职者

这里 keyword 为字符串数组。默认分隔符可以使用 --array-delimiter 指定。

3.2 跳过指定列

如果想要忽略掉 csv 文件中的某一列,可以使用 IGNORE 指出,此时可以忽略掉 <field_type>

person_id:ID,name,:IGNORE,:LABEL
keanu,"Keanu Reeves","male",Actor
...

3.3 为节点或关系指定统一的 LABEL

如果一个 csv 文件中存放的都是同一类的节点或者关系,那么每一行都增加一个 LABEL 字段,则略显麻烦。此时可以在 nodes 或者 relationships 后面给出一个或多个 LABEL。

neo4j_home$ bin/neo4j-admin import --nodes:Movie import/movies.csv     --nodes:Movie:Sequel import/sequels5a.csv \ # 指定多个 LABEL
    --nodes:Actor import/actors5a.csv     --relationships:ACTED_IN import/roles5a.csv # 为关系指定 LABEL

3.4 跳过不存在的节点

创建关系的时候,如果起始或者结束节点不存在,这个时候该如何处理。报错,还是跳过。

使用选项 --ignore-missing-nodes 跳过。

3.5 忽略重复的节点

如果节点的 ID 存在重复,那就不满足节点 ID 必须唯一的要求,会报错。可以使用 --ignore-duplicate-nodes 忽略掉 ID 重复的行。

使用导入工具

为了避免输入过长的命令行参数,这里提供了一段 python 脚本,用来生成并执行相应的命令。用法如下:

$ sudo python import.py config.json

因为在脚本中使用了 neo4j-admin 命令,为了能够找到该命令,需要配置环境变量 NEO4J-HOME 为 neo4j 的安装目录。且数据库的导入需要提供管理员权限。

其中 config.json 为配置文件,文件格式如下:

{
    "database": "graph.db", // 指定数据库名,默认为 `graph.db`
    "nodes": [{ // 指定节点对应的 csv 文件
        "file": "../data/parsed/n_jd_data.csv",
        "label": "招聘公告"
    }],
    "relationships": [{ // 指定关系对应的 csv 文件
        "file": "../data/parsed/r_exposure_job_data.csv",
        "type": "曝光"
    },{
        "file": "../data/parsed/r_publish_job_data.csv"
    }],
    "delimiter": ",",  // 指定 csv 文件的分隔符,默认为 `,`
    "array-delimiter": ";",  // csv 文件中某个字段为数组是,数组元素间的分隔符
    "quote": "\"",  // csv 文件中引号
     // 是否忽略重复的节点,即 ID 重复的是否忽略,默认为 false
    "ignore-duplicate-nodes": true,
     // 是否忽略重复的节点,即 ID 重复的是否忽略,默认为 false
    "ignore-missing-nodes": true
}

注意事项

如果某个存储节点信息或关系信息的 csv 文件中,存放的都是同种类型的节点或者关系,那么可以在配置文件中指定 label(对于节点)或者 type(对于关系),这样以来,就不需要在文件中,添加 :LABEL 或者 :TYPE 列了。

在 csv 文件中,需要注意内容中出现 列分隔符数组元素分隔符 的情况,这种情况可能导致 csv 文件格式出错,导致导入失败。

neo4j

标签:管理   duration   不同   user   iter   密码   unity   row   art   

原文地址:https://www.cnblogs.com/wy-ei/p/9251305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!