图数据库Neo4j安装

简介

Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。

官方网站

https://neo4j.com/

安装neo4j图数据库

1.下载neo4j社区版

从官方网站下载最新的社区版3.5.13

2.安装jdk

1yum -y install java-1.8.0

3.安装neo4j

1tar xf neo4j-community-3.5.13-unix.tar.gz -C /opt
2cd /opt
3ln -s neo4j-community-3.5.13 neo4j

4.配置neo4j

1cd neo4j
2vim conf/neo4j.conf
3dbms.connectors.default_listen_address=0.0.0.0

5.运行neo4j

1bin/neo4j start

6.systemd文件

 1cat > /usr/lib/systemd/system/neo4j.service <<-EOF
 2
 3[Unit]
 4Description=Neo4j Community Server
 5After=network.target
 6
 7[Service]
 8User=neo4j
 9ExecStart=/opt/neo4j/bin/neo4j console
10ExecReload=/bin/kill -HUP \$MAINPID
11KillMode=process
12Restart=always
13RestartSec=10s
14
15[Install]
16WantedBy=multi-user.target
17EOF
18
19useradd -s /bin/false -M neo4j
20chown -R neo4j. /opt/neo4j*
21
22systemctl enable neo4j
23systemctl start neo4j

测试neo4j

访问neo4j

打开浏览器,输入服务器ip,默认端口7474,http://192.168.0.245:7474 初始用户名和密码均为neo4j,登录上去修改密码,修改后的密码为beixi123

在网页上创建节点和关系

 1# 创建具有带属性(name ,age)的 People 节点
 2create(p:People{name:"Alex", age:20});
 3
 4create(p:People{name:"Tom", age:22});
 5
 6# 匹配 People节点,并返回其 name 和 age 属性
 7match (p:People) return p.name, p.age
 8
 9# 匹配所有 age 为20的 People 节点
10match (p:People{age:20}) RETURN p
11
12# 创建 Alex 和 Tom 之间单向的 Friend 关系
13create(:People{name:"Alex", age:20})-[r:Friends]->(:People{name:"Tom", age:22})
14
15#
16match p=()-[r:RELATION]->() return p LIMIT 25
17
18# 匹配所有节点并查看其中25个
19match (n) return n LIMIT 25;
20
21# 简单粗暴删除所有节点及节点相关的关系
22match (n) detach delete n

测试演示数据

爬取数据,获取数据来源

1cat requirements.txt
2numpy==1.17.4
3pandas==0.25.3
4python-dateutil==2.8.1
5pytz==2019.3
6fake-useragent==0.1.11
 1cat scapy.py
 2import time
 3import random
 4import requests
 5from lxml import etree
 6import pandas as pd
 7from fake_useragent import UserAgent
 8
 9ylq_all_star_ids = pd.DataFrame(columns = ['num', 'name', 'star_id', 'star_url', 'image'])
10total_pages=153
11for page in range(1, total_pages+1):
12    ua = UserAgent()
13    headers ={"User-Agent": ua.random,
14              'Host': 'www.ylq.com'}
15    url = 'http://www.ylq.com/star/list-all-all-all-all-all-all-all-{}.html'
16    r = requests.get(url=url.format(page), headers=headers)
17    r.encoding = r.apparent_encoding
18    dom = etree.HTML(r.text)
19
20    # 'http://www.ylq.com/neidi/xingyufei/'
21    star_urls = dom.xpath('//div[@class="fContent"]/ul/li/a/@href')
22    star_ids = [star_url.split('/')[-2] for star_url in star_urls]
23    star_names = dom.xpath('//div[@class="fContent"]/ul/li/a/h2/text()')
24    star_images = dom.xpath('//div[@class="fContent"]/ul/li/a/img/@src')
25
26    print(page, len(star_urls), len(star_ids), len(star_images), len(star_names))
27
28    for i in range(len(star_ids)):
29        ylq_all_star_ids = ylq_all_star_ids.append({'num':int((page-1)*60+i+1), 'name': star_names[i],
30                                                    'star_id':star_ids[i], 'star_url': star_urls[i],
31                                                    'image':star_images[i]},ignore_index=True)
32    # if page%5 == 0:
33    #    time.sleep(random.randint(0,2))
34print("爬虫结束!")

执行爬取脚本

1python3 scapy.py

导入csv到neo4j

1cd /opt/neo4j/import
2wget https://github.com/DesertsX/gulius-projects/raw/master/5_YuLeQuan_Neo4j/ylq_star_nodes.csv
3wget https://github.com/DesertsX/gulius-projects/raw/master/5_YuLeQuan_Neo4j/ylq_star_relations.csv

在浏览器中执行

1LOAD CSV  WITH HEADERS FROM 'file:///ylq_star_nodes.csv' AS data CREATE (:star{starname:data.name, starid:data.id});
2
3LOAD CSV  WITH HEADERS FROM "file:///ylq_star_relations.csv" AS relations MATCH (entity1:star{starname:relations.subject}) , (entity2:star{starname:relations.object}) CREATE (entity1)-[:rel{relation: relations.relation}]->(entity2);

第一条命令秒开,第二条命令这边花了差不多70秒左右。

查询关系图谱

1# 查某人全部关系
2return (:star{starname:"张国荣"})-->();

张国荣

1# 查某人朋友的朋友(5层关系)
2match p=(n:star{starname:"张国荣"})-[*..5]->() return p limit 50;

张国荣

1# 查询特定关系
2match p=()-[:rel{relation:"旧爱"}]->() return p LIMIT 25;

旧爱

1# 使用函数,查询张国荣与张卫健的最短路径
2match p=shortestpath((:star{starname:"张国荣"})-[*..5]->(:star{starname:"张卫健"})) return p;

张国荣和张卫健

参考资料

  1. 知乎 - 一文教你用 Neo4j 快速构建明星关系图谱

相关书籍

  1. Neo4j Cookbook -2015
  2. Neo4j in Action - 2014
  3. Building Web Applications with Python and Neo4j - 2015
  4. Neo4j权威指南 - 2017
  5. Neo4j 3.x入门经典 - 2019