1. 环境搭建

正好最近同学有一台阿里云服务器借我玩,就尝试着在服务器上搭了Neo4j。

环境:CentOS Linux release 7.4.1708 (Core)

安装Java

安装Neo4j需要Java环境。并且需要jdk1.8,所以低版本需要卸载重装。

官网 复制下载链接,然后到命令行找一个目录下载:

wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.rpm"

(开始直接wget下载,然后解压一直出错,最后发现下载的是...HTML document,真的是尴尬,然后找到了这个下载方法)

安装:sudo rpm -ivh jdk-8u151-linux-x64.rpm

查看安装版本:java -version

当看到

java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

Java安装成功!

(我真的是...装了好久...蠢哭)

安装Neo4j

官网有 教程 安装社区版。

[root@neo4j]# wget http://debian.neo4j.org/neotechnology.gpg.key
[root@neo4j]# rpm --import neotechnology.gpg.key
[root@neo4j]# cat <<EOF > /etc/yum.repos.d/neo4j.repo
> [neo4j]
> name=Neo4j Yum Repo
> baseurl=http://yum.neo4j.org/stable
> enabled=1
> gpgcheck=1
> EOF [root@neo4j]# yum install neo4j -y

嗯。。下载速度比较超级慢,等了十多分钟。

查看安装版本:

[root@neo4j]# neo4j version
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
neo4j 3.3.0

已经安装成功,版本为3.3.0。

启动Neo4j服务

启动:neo4j console

Active database: graph.db
Directories in use:
home: /var/lib/neo4j
config: /etc/neo4j
logs: /var/log/neo4j
plugins: /var/lib/neo4j/plugins
import: /var/lib/neo4j/import
data: /var/lib/neo4j/data
certificates: /var/lib/neo4j/certificates
run: /var/run/neo4j
Starting Neo4j.
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
2017-10-31 15:50:26.178+0000 WARN dbms.directories.certificates is deprecated.
2017-10-31 15:50:26.221+0000 INFO ======== Neo4j 3.3.0 ========
2017-10-31 15:50:26.279+0000 INFO Starting...
2017-10-31 15:50:28.849+0000 INFO Bolt enabled on 127.0.0.1:7687.
2017-10-31 15:50:34.056+0000 INFO Started.
2017-10-31 15:50:35.693+0000 INFO Remote interface available at http://localhost:7474/

可以看到配置文件位置:/etc/neo4j,找到并去掉该句注释#dbms.connectors.default_listen_address=0.0.0.0,实现远程访问。

重新启动,然后在浏览器输入:http://server_ip:7474/即可访问。



惊不惊喜,激不激动!反正我心好累啊...因为我好迷茫...密码又是啥啊!!!(默认密码是neo4j

在试了不加密码和'neo4j'以后,又在网上找到了不需要密码的方法,去掉#dbms.security.auth_enabled=false的注释,然鹅还是登!录!不!进!去!

后来看浏览器控制台报错,终于发现好像是ip:7687这个网址连接不上……好吧,又开了一个端口号,终于可以登录了,凌晨一点多了,要哭了好吗……说好的早睡呢……

打开之后是万年不变的Hello World:

清空数据库

文件存储位置:/var/lib/neo4j/datadatabases/graph.db

直接全部删除:rm -rf /var/lib/neo4j/datadatabases/graph.db

2. 基础概念

Neo4j是一个NoSQL图形数据库。和SQL比,能更好的表现出数据之间的关系。Neo4j中记录和关系有同等重要的地位。可以简洁高效的查出节点之间的关系。

节点(Nodes):一个节点就是图形数据库的一条记录。在图中以一个圆圈的形式表现。

关系(Relationships):关系用来连接节点,一个关系连接两个节点。关系是有向的,连接的点分为源点和目标点。不同的节点可以通过关系连接起来。(同一个节点也可以有关系,自环。)但是一个关系有且只能有一个类型(Types)。在图中是连接圆圈的边。

属性(Properties):图形数据库中数据作为属性存在节点中。属性为键值对形式,一个节点可以有多个属性。关系也可以拥有属性。每一个节点或属性都有一个integer类型的默认属性id,用来唯一标识节点/属性。

标签(Labels):用来标识一个节点属于哪一类。一个节点可以有多个或0个标签。标签没有属性。(比如博客每一篇文章都有添加标签选项,当写一篇Java操作Neo4j的文章,可能会添加JavaNeo4j两个标签,当查看关于Java的文章时,可以通过标签Java快速搜索。也有点类似于接口,但是标签没有属性,类似于没有内容的接口>_<)

路径(Path):看图很好理解,就是从一个节点出发经过一些关系和节点之后,到达某个节点的全部过程。一个路径看起来是(node)-[relation]-...-(node)这样子的。单独一个节点也可以看做是一个长度为0的路径。

可以通过``(反单引号)将标签或属性名括起来防止和关键字冲突。

3. Cypher

Cypher是Neo4j的图形查询语言,关键字大小写不敏感。(大写打起来太麻烦了 一律用小写...)语法和SQL很像,学起来相对简单。

基本格式:

MATCH <pattern> WHERE <conditions> RETURN <expressions>

() 表示节点

[] 表示关系

{} 表示节点的属性,每个属性通过key:value的形式表示,多个属性之间用逗号隔开

node:label1:label2 通过冒号给节点添加标签,通过冒号分隔多个标签

数据类型:

boolean:true/false

integer:64位整数

float:64位浮点数

String:Unicode字符串

[]:表示数组

节点相关操作

  • 节点

    () 表示一个最简单的节点,没有标签和属性。

    (:label1) 有一个标签的节点

    (:label1:label2:label3) 有多个标签的节点

    (:label1 {prop1:value1}) 有一个属性的节点

    (:label1 {key1:value1,key2:value2}) 有一个标签和节点

    (nodeName:label1 {key1:value1}) 这里可以给node起一个别名,但是,这只是一个别名,和节点本身无关,是一个变量,用于后续语句操作该节点,而不是节点的名字。

  • 新增

    新增的关键字是CREATE

    create (:女:成年:教师{age:28,name:'刘一'}); // 新增一个有三个标签 两个属性的节点
    create (N:男:成年:医生{age:32,name:'陈二'}) return N; // 创建一个节点并返回

    创建节点时将自动为节点生成一个idid是唯一且递增的。

  • 查找

    查找的关键词是MATCHWHERE

    match可以用来匹配模式和简单匹配数据,where用来限定条件。通过.来引用节点的属性Node.PropertyKey,可以同时查询多个节点并返回。

    match(n) return n;      // 不设条件 查询数据库所有节点
    match(n:男{age:32}) return n; // 匹配标签有'男'且含有属性age=32的节点
    match(n) where n.age<30 return n; // 查询属性age<30的节点
    match(n), where id(n)=1 return n; // 通过id查询节点
    match(n),(m:女) where id(n)=20 return n,m; // 同时查询多个节点,当n,m都存在的时候才返回
  • 修改

    修改的关键字为SET

    格式:

    修改节点属性:{{ 查询语句 }} set n.propertKey=newValue;

    添加节点标签:{{ 查询语句 }} set n:<label>

    match(n{age:32}) set n.age=33; // 将所有age=32的节点的age属性改为33
    match(n) where id(n)=1 set n.age=33 return n; // 将所有age=32的节点的age属性改为33 并返回修改后的节点
    match(n) where id(n)=20 set n:神经病 return n; // 为节点添加一个标签<神经病>
  • 删除

    删除关键词:DELETE,REMOVE

    DELETE:删除节点,格式:DELETE <node>

    REMOVE:删除节点或关系的标签或属性,格式:REMOVE node.propertyKeyREMOVE node:label

    match(n) where id(n)=23 delete n;   // 删除一个节点
    match(n) where id(n)=20 remove n:`神经病` return n; // 删除标签
    match(n) where id(n)=20 remove n.age return n; // 删除属性

    当一个节点有关联关系的时候,是不能被删除的,必须要先删除相关关系。

    match (n) where id(n)=40 detach delete n;   // 删除一个节点相关关系 然后删除该节点

关系相关操作

  • 关系

    -- 无向关系

    <----> 有向关系

    -[:type]-> 表示一个类型为type的关系

    -[:type {key1:value1,key2:value2}] 关系也可以有一个或多个属性。

    -[rel:type {key1:value1,key2:value2}] 同节点,这里rel只是关系的一个别名而已。

    创建关系时必须有方向,关系也必须有且只有一个类型。

关系的操作和节点相仿。

  • 新增

    match (n{name:'刘一'}),(m{name:'陈二'}) create (m)-[r:love]->(n) return type(r); // 找到两个节点并创建类型为`love`的关系,返回关系类型。
    create (n1:N{name:'first'})-[r1:R]->(n2:N{name:'second'})<-[r2:R]-(n3:N{name:'third'}) return n1,r1,n2,r2,n3; // 创建了三个节点两个关系
  • 查找

    单独返回关系并没有返回结果,可以选择一起返回关系及关系相关节点,或者返回路径。

    match ()-[r]-() where id(r)=13 return r;
    match (n)-[r]-(m) where n.name='刘一' and m.name='陈二' return n,r,m; // where中多个查询条件用and连接 表示与关系
    match p=(n)-[r]-(m) where n.name='刘一' and m.name='陈二' return p; // 查询路径
  • 修改

    match ()-[r]-() where id(r)=2 set r.reason=['fairness','cute','comely','gorgeous']; // 为关系新增了一个属性`reason`,属性值是一个数组。
    match p=()-[r]-() where id(r)=2 set r.reason='no reason!' return p; // 又将`reason`属性修改为字符串
  • 删除

    remove 删除属性、delete 删除关系

    match p=()-[r]-() where id(r)=2 remove r.reason return p; // 删除关系属性
    match p=()-[r]-() where id(r)=2 delete r;

    删除所有节点&关系: match (n) detach delete n;

Merge子句

Merge子句的作用有两个:当模式(Pattern)存在时,匹配该模式;当模式不存在时,创建新的模式,功能是match子句和create的组合。在merge子句之后,可以显式指定on creae和on match子句,用于修改绑定的节点或关系的属性。

  • 简单匹配或创建

    merge (n:狗{name:'dog'}) return n 将创建并返回节点'dog'

    merge (n:狗{name:'dog'}) return n 返回已存在节点'dog'
  • on create 如果是创建则执行

    merge (n:狗{name:'dog1'}) on create set n.create=timestamp() return n 如果是新创建的节点就设置create属性,timestamp()函数返回当前时间,类型为integer。
  • on match 如果已存在则执行该子句

    merge (n:狗{name:'dog'}) on match set n.update=timestamp() return n
  • 可以同时指定on createon match

    merge (n:狗{name:'dogx'}) on create set n.version=0 on match set n.version=n.version+1 return n.version

查询语句

清空数据库,然后插入十条语句。并创建一些关系,用于后续查询。

原谅我肤浅,只能想出这种数据……(捂脸)

MATCH (n) DETACH DELETE n

CREATE
(N1:女:成年:教师{age:28,name:'刘一',interest:['shopping','reading']}),
(N2:男:成年:医生{age:28,name:'陈二',interest:['football']}),
(N3:女:未成年:学生{age:17,name:'张三',interest:['games']}),
(N4:男:成年:教师{age:23,name:'李四',interest:['reading']}),
(N5:女:成年:医生{age:25,name:'王五',interest:['reading']}),
(N6:男:未成年:学生{age:13,name:'赵六'}),
(N7:女:成年:程序员{age:36,name:'孙七'}),
(N8:男:成年{age:68,name:'周八'}),
(N9:女:未成年:学生{age:16,name:'吴九'}),
(N10:男:未成年{age:15,name:'郑十'}),
(N1)-[:love]->(N2)<-[:love]-(N3),
(N4)-[:know]->(N5),
(N4)-[:know]->(N6),
(N5)-[:know]->(N7),
(N5)-[:know]->(N8),
(N6)-[:know]->(N7),
(N7)-[:know]->(N8),
(N9)-[:hate]->(N8)
  • 常用谓词

    and表示查询条件与关系,or表示或关系,xnot表示异或,not表示非。

    查询年龄在[15,25]之间的女生:match (n:女) where n.age>=15 and n.age<=25 return n

    查询年龄不大于18的人:match (n) where not n.age>18 return n

  • 其他常用关键词

    distinct 表示查询去掉重复 有些查询在图形中表示不出来,需要到Table中查看查询结果。

    查询所有人的年龄,并且去掉重复:match (n) return distinct n.age

    order by表示排序,默认升序。

    查询所有人按年龄排序:match (n) return n order by n.age desc

    skip表示忽略前面一定数量,limit表示查询数量。

    查看年龄最大的五个人:match (n) return n order by n.age skip 5 limit 5

    关键字in表示是否包含在数组中。

    查询名字为'张三','李四','王五'的人:match (n) where n.name in ['张三','李四','王五'] return n

    查询喜欢阅读的人:match (n) where 'reading' in n.interest return n

  • 聚合函数

    count(),min(),max(),avg(),sum(),collect()

    查询年龄的平均值:match (n) return avg(n.age)

    查询学生数量:match (n:学生) return count(n)

    查询并返回所有人的集合:match (n) return collect(n)

  • 常用函数

    keys(node)/keys(relationship)查看节点或关系的属性键。

    查询属性:match (n)-[r]-() return keys(n), keys(r)

    properties(node)/properties(relationship)查看的是属性键值对。

    查询属性值:match (n)-[r]-() return properties(n), properties(r)

    exists()查询属性是否存在

    查询存在interest属性的节点:match (n) where exists(n.interest) return n

    labels(node)函数返回节点的标签集合

    查询不是程序程序员的成年人:match (n) where '成年' in labels(n) and not '程序员' in labels(n) return n;

    nodes(path)查询路径相关节点,relationships(path)查询路径相关关系。

    返回路径中的节点:match p=()-[:love]->()<-[:love]-() return nodes(p);

    startNode()endNode() 查看关系的起止节点。

    查看男女之间的关系(哪里奇怪?):match p=(:男)-[r]-(:女) return startNode(r).name, endNode(r).name;

  • 查询路径

    [*]表示不限制路径的长度。length(path)查询一条路径长度。

    查询李四周八的所有路径:match p=({name:'李四'})-[*]-({name:'周八'}) return p, length(p)

    [*n]距离为n, [*..n]最大距离为n,[*n..]最小距离为n,[*m..n]距离在m到n之间。

    查询李四周八长度为2的路径:match p=({name:'李四'})-[*2]-({name:'周八'}) return p

    查询最短路径shortestPath

    查询李四周八之间最短的路径:match (n{name:'李四'}) match (m{name:'周八'}) return shortestPath((n)-[*]-(m)) as p

  • 字符串匹配

    starts with, end with, contains

    查询名字以'一'结束的节点:match (n) where n.name ends with '一' return n

    正则表达式=~

    也可以通过正则表达式查询:match (n) where n.name =~ '.一' return n

  • WITH 子句

    可以实现子查询,随便举个例子,查询版本姓名的xxx的年龄最大的人

match (n:people)
where n.name='xxx'
with max(n.age) as mage
match (m:people)
where m.name='xxx' and m.age = mage
return m;

Neo4j学习笔记的更多相关文章

  1. Neo4j学习笔记(1)——使用API编写一个Hello World程序

    项目的创建及配置 因为Neo4j依赖的jar包比较多,所以推荐使用Maven来管理. 首先创建一个Maven Project,添加依赖: <dependency> <groupId& ...

  2. Neo4j学习笔记(1)——使用Java API实现简单的增删改查

    阅读目录 项目的创建及配置 使用嵌入式数据库 创建节点和关系 查询及更新 删除关系和节点 完整代码 参考资料 回到顶部 项目的创建及配置 因为Neo4j依赖的jar包比较多,所以推荐使用Maven来管 ...

  3. Neo4j 学习笔记(-)

    Neo4j 的使用说明(一)(基于V3.4.9) 下一篇(二):https://www.cnblogs.com/infoo/p/11947467.html 一.Neo4j简介 Neo4j是一个高性能的 ...

  4. Neo4j学习笔记(2)——数据索引

    和关系数据库一样,Neo4j同样可以创建索引来加快查找速度. 在关系数据库中创建索引需要索引字段和指向记录的指针,通过索引可以快速查找到表中的行. 在Neo4j中,其索引是通过属性来创建,便于快速查找 ...

  5. neo4j 学习笔记

    1.参考 https://blog.csdn.net/appleyk/article/category/7408344 系列文章 (不支持 spring boo 2.0 以下的,入门可做参考) 2.底 ...

  6. 暑假学习笔记(一)——初识Neo4j和APICloud入门

    暑假学习笔记(一)--初识Neo4j和APICloud入门 20180719笔记 1.Neo4j 接了学姐的系统测试报告任务,感觉工作很繁重,但是自己却每天挥霍时光.9月份就要提交系统测试报告了,但是 ...

  7. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

  8. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  9. Redis——入门学习笔记

    Redis学习 说到前面:这篇笔记只是我作为一个Redis新手,从0到认知的一个过程.后续会持续深入学习. 学习初衷和计划 学习Redis,因为这是热门技术,必须掌握的技术,别人都会我不会.就这一点就 ...

随机推荐

  1. Windbg驱动双机调试环境配置

    [由于进入了Windows驱动编程领域第一步就是搭建环境,整个环境来说说难也不难,只是比较麻烦.文章有些地方比较繁琐的,而且别人写的比较好,作为引用参考直接贴连接了.如果你按照我写的一步步完成,很快就 ...

  2. fabric 在阿里云Ubuntu部署 注意

    部署时候报 段错误: signal SIGSEGV: segmentation violation code=0x1 addr=0x63 pc=0x7fcd47490259] 解决方案: 更新Hype ...

  3. 安装Ubuntu 18.04后的一些操作

    安装Ubuntu 18.04后的一些操作 1.设置root密码 sudo passwd 2.登陆root(输入密码后看到井号就是切换成为root账户) su 3.删除预装 apt-get remove ...

  4. 微信公众号的分享接口,分享提示config:fail,invalid signature的解决办法(2017年12月)

    微信中打开网页,使用微信右上角菜单中自带的分享功能的经历及总结: 最开始,微信分享页面时,直接读取页面的标题(title)和页面中的第一张符合条件的图片[此种方式在2017-03-29之前管用,这一天 ...

  5. Python开发——面向对象【类、实例】

    类 # class Chinese(object): class Chinese: ''' 类的说明性文档 ''' pass print(Chinese) # <class '__main__. ...

  6. Volatile 关键字 内存可见性

    1.问题引入 实现线程: public class ThreadDemo implements Runnable { private boolean flag = false; @Override p ...

  7. 关闭浏览器时提示的javascript事件

    onbeforeunload事件 它是这样用的: <script language="javascript"> g_blnCheckUnload = true; fun ...

  8. ABP 异常处理 第四篇

    1.ABP异常处理机制是通过过滤器实现的,我们查看的webAPI的异常处理,我们来看看他的源码,AbpApiExceptionFilterAttribute 继承ExceptionFilterAttr ...

  9. C#sealed和final

    sealed用于类时,该类被称为密封类,密封类不能被继承: C#提出了密封方法(sealed method) 的概念,以防止在方法所在类的派生类中对该方法的重载.对方法可以使用sealed 修饰符,这 ...

  10. 服务器被minerd

    cd /opt chmod -x minerd 去/root/.ssh 目录下,清除authorized_keys,KHK75NEOiq 文件 在ssh的配置文件/etc/ssh/sshd_confi ...