CQL函数

1. 字符串函数

功能 描述
UPPER 将所有字母改为大写
LOWER 将所有字母改为小写
SUBSTRING 将获取指定范围的子字符串
REPLACE 替换一个字符串的子字符串
match (p:Person) return ID(p),LOWER(p.character)

2. 聚合函数

聚集功能 描述
COUNT 它返回由MATCH命令返回的行数
MAX 它从MATCH命令返回的一组行返回最大值
MIN 它返回由MATCH命令返回的一组行的最小值
SUM 它返回由MATCH命令返回的所有行的求和
AVG 它返回由MATCH命令返回的所有行的平均值

示例:

match (p:Person) return max(p.money)

3. 关系函数

功能 描述
STARTNODE 用于知道关系的开始节点
ENDNODE 用于知道关系的结束节点
ID 用于知道关系的ID
TYPE 用于知道字符串表示中的一个关系的TYPE

示例:

match p=(:Person {name:"范闲"})-[r:Couple]-(:Person) return ENDNODE(r)

match p=(:Person {name:"范闲"})-[r:Couple]-(:Person) return type(r)

4. 返回最短路径

shortestPath函数

示例:

match p=shortestPath((person:Person {cid:1})-[*]-(person2:Person {cid:8})) return length(p),nodes(p)

CQL多深度关系节点

1. 使用with关键字

查询三层级关系节点如下:with可以将前面查询结果作为后面查询条件

match (na:Person)-[re]->(nb:Person) where na.name="范闲" WITH na,re,nb match (nb:Person)-
[re2]->(nc:Person) return na,re,nb,re2,nc

2. 直接拼接关系节点查询

match data=(na:Person{name:"范闲"})-[re]->(nb:Person)-[re2]->(nc:Person) return data

3. 使用深度运算符

-[:TYPE*minHops..maxHops]-

minHops代表最小深度,maxHops代表最大深度。

match data=(na:Person{cid:1})-[*1..2]-(:Person) return data

事务

Neo4j支持ACID特性

  • 所有对Neo4j数据库的数据修改操作都必须封装在事务中
  • 默认的isolation level是READ_COMMITTED
  • 死锁保护已经内置到核心事务管理。
  • 除特殊说明,Neo4j的API操作都是线程安全的,Neo4j数据库的操作也就没有必要使用外部的同步方法。

索引

Neo4j支持在节点或关系的属性上建立索引,以提高应用程序的性能。可以在Match或where等运算符上使用这些索引改进SQL的执行。

  1. 单一索引
CREATE INDEX ON :Label(property)

示例:

create index on:Person(name)
  1. 复合索引
create index on:Person(age,gender)
  1. 全文索引

常规索引只能对字符串进行精确匹配或前后缀索引,而全文索引可以匹配字符串任何位置的词语。

使用db.index.fulltext.createNodeIndex和db.index.fulltext.createRelationshipIndex可以分别为节点和关系创建全文索引。在创建索引时,必须指定唯一的名称,用于查询和删除索引时要引用。

call db.index.fulltext.createNodeIndex("索引名",[Label,Label],[属性,属性])

示例:

call db.index.fulltext.createNodeIndex("nameAndDescription",["Person"],["name",
"description"]) call db.index.fulltext.queryNodes("nameAndDescription", "范闲") YIELD node, score
RETURN node.name, node.description, score
  1. 查看索引
call db.indexes 或:schema
  1. 删除索引
DROP INDEX ON :Person(name)
DROP INDEX ON :Person(age, gender)
call db.index.fulltext.drop("nameAndDescription")

约束

作用:唯一性约束用于避免重复记录

1. 创建唯一性约束

CREATE CONSTRAINT ON (变量:<label_name>) ASSERT 变量.<property_name> IS UNIQUE

示例:

create constraint on(person:Person) assert person.name is unique

2. 删除唯一性约束

drop constraint on (person:Person) assert person.name is unique

3. 查看约束

call db.constraints
#或
:schema

Neo4j服务管理

1. 备份和恢复

  1. 备份之前先停止服务
 bin/neo4j stop
  1. 备份命令
bin/neo4j-admin dump --database=graph.db --to=/usr/local/qyn.dump

然后启动服务,删除所有数据。然后在停止服务,准备恢复

match (p)-[r]-() delete p,r
  1. 恢复命令
bin/neo4j-admin load --from=/usr/local/qyn.dump --database=graph.db --force

注意:运行数据备份可能会警告

WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j manual

编辑这个文件:vim /etc/security/limits.conf,在文件最后面加上这段,修改最大打开文件限制,在重启服务器就行了。

*        soft   nofile     65535
*        hard   nofile     65535

2. Neo4j调优

2.1 调整neo4j配置文件

# neo4j初始堆内存
dbms.memory.heap.initial_size=512m
# 最大堆内存
dbms.memory.heap.max_size=512m
# pagecache大小,官方建议设为:(总内存-dbms.memory.heap.max_size)/2
dbms.memory.pagecache.size=10g

2.2 数据预热

match (n)
optional match (n)-[r]->()
return count(n.name)+count(r)
  1. 使用执行计划命令优化

有如下两个命令:

  • Explain :解释机制,加入该关键字的Cypher语句可以预览执行的过程但是不实际执行
  • Profile:画像机制,查询中使用该关键字能够看到执行计划详细内容,还能看到查询的结果

示例:

profile match (p:Person {name:"范闲"}) return p

需要关注指标:

关注指标:

estimated rows: 需要被扫描行数的预估值

dbhits: 实际运行结果的命中绩效

Neo4j 程序访问

1. 数据库访问方式

Neo4j访问有两种方式:

  • 嵌入式数据库
  • 服务器模式(通过REST的访问)

嵌入式数据库

嵌入式Neo4j数据库是性能的最佳选择,通过指定数据存储的路径以编程的方式访问。我们选择嵌入式数据库有如下的原因:

  • 使用java作为编程语言
  • 应用程序独立
  • 程序追求很高的性能

服务器模式

Neo4j Server是相互操作性、安全性和监控的最佳选择。实际上,REST接口允许所有现代平台和编程语言与它进行交互操作。此外,作为独立应用程序,他比嵌入式配置更安全(客户端的故障不会影响服务器),更易于监控。而且可以使用任意编程语言以REST的方式访问数据库。

2. Java客户端访问

2.1 嵌入式模式

<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j</artifactId>
<version>3.5.5</version>
</dependency>

新增数据

 public static void add(){
GraphDatabaseService graphDb= new GraphDatabaseFactory().newEmbeddedDatabase(databaseDirectory);
System.out.println("database load");
Transaction tx = graphDb.beginTx();
Node node = graphDb.createNode();
node.setProperty("name","张三");
node.setProperty("character","A");
node.setProperty("money",2330);
node.addLabel(() -> "Person");
tx.success();
tx.close();
graphDb.shutdown();
}

查询数据

public static void query(){
GraphDatabaseService graphDb= new GraphDatabaseFactory().newEmbeddedDatabase(databaseDirectory);
System.out.println("database load");
String cql="match (a:Person) where a.money < $money return a";
Map<String,Object> paramerters= new HashMap<>();
paramerters.put("money",2500);
Transaction tx=graphDb.beginTx();
Result result = graphDb.execute(cql, paramerters);
while (result.hasNext()){
Map<String, Object> row = result.next();
for (String key : result.columns()){
Node nd = (Node)row.get(key);
System.out.printf("%s = %s:%s%n",key,nd.getProperties("name"),nd.getProperties("money"));
}
}
tx.success();
tx.close();
graphDb.shutdown();
}

2.2 服务器模式

<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-bolt-driver</artifactId>
<version>3.2.10</version>
</dependency>

查询示例:

public static void query(){
Driver driver = GraphDatabase.driver("bolt://192.168.56.115:7687", AuthTokens.basic("neo4j", "123456"));
Session session = driver.session();
String cql="match (a:Person) where a.money > $money return a.name as name,a.money as money order by a.money";
Result result = session.run(cql, Values.parameters("money", 400));
while (result.hasNext()){
Record record = result.next();
System.out.println(record.get("name").asString()+" "+record.get("money").asDouble());
}
session.close();
driver.close(); }

SpringBoot 整合Neo4j

  1. 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
  1. 编写配置文件
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=123456
spring.data.neo4j.uri= bolt://192.168.56.115:7687
  1. 建立实体类
@NodeEntity
@Data
public class Person {
@Id
@GeneratedValue
private Long id; private Integer cid; private String name; private String character; private Double money; private Integer gender; private Integer age; private String description; @Relationship(type = "Friend",direction = Relationship.OUTGOING)
private Set<Person> relationPersons;
  1. 编写数据持久层
@Repository
public interface PersonRepository extends Neo4jRepository<Person,Long> { @Query("match(p:Person) where p.money > {0} return p")
List<Person> personList(Double money); @Query("match p=shortestPath((person:Person {name:{0}}) - [*1..2] - (person2:Person {name:{1}})) return p ")
List<Person> shortestPath(String startName,String endName);
}
  1. 测试
Iterable<Person> all = personRepository.findAll();
System.out.println(all);

Neo4j应用的更多相关文章

  1. 图形数据库Neo4J简介

    最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有意思的.因此在这里给大家做一个简单的介绍. NoSQL数据库相信大家都听说过.它们常常可以用来处理传统的关系型数 ...

  2. neo4j关闭和开启密码访问权限

    本例:neo4j-enterprise-2.3.1版本 neo4j默认安装是开启访问密码验证 可以发现,在conf/下的neo4j-server.properties配置文件 # Require (o ...

  3. neo4j初次使用学习简单操作-cypher语言使用

    Neo4j 使用cypher语言进行操作 Cypher语言是在学习Neo4j时用到数据库操作语言(DML),涵盖对图数据的增删改查  neo4j数据库简单除暴理解的概念: Neo4j中不存在表的概念, ...

  4. Neo4j图数据库管理系统开发笔记之一:Neo4j Java 工具包

    1 应用开发概述 基于数据传输效率以及接口自定义等特殊性需求,我们暂时放弃使用Neo4j服务器版本,而是在Neo4j嵌入式版本的基础上进行一些封装性的开发.封装的重点,是解决Neo4j嵌入式版本Emb ...

  5. infoq - neo4j graph db

    My name is Charles Humble and I am here at QCon New York 2014 with Ian Robinson. Ian, can you introd ...

  6. Neo4j 3.0 存储过程

    Neo4j 3.0 提供一个新的功能“存储过程”,该功能并不是Neo4j-Server的扩展,而是可以直接运行的. 在写这篇文章的时候,只能通过预备好的语句去执行 1 CALL package.pro ...

  7. neo4j中文社区

    关于Neo4j中文社区 官网:http://neo4j.com.cn/ Neo4j 社区为国内具影响力的 Neo4j技术社区,致力于 Neo4j 的技术研究. Neo4j 社区由一批热爱 Neo4j ...

  8. Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目

    Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目 新建一个maven工程,这里不赘述如何新建maven工程. 添加Neo4j jar到你的工程 有两种方 ...

  9. Neo4j批量插入(Batch Insertion)

    新建一个maven工程,这里不赘述如何新建maven工程. 添加Neo4j jar到你的工程 有两种方式: 上网站官网下载jar包,根据自己的系统下载不同的压缩包,详细过程不描述,请自行搜索其他博客 ...

  10. 嵌入式(Embedded)Neo4j数据库访问方法

    应用中采用嵌入式Neo4j(Embedded Neo4j)数据库,插入数据后不知道如何访问.查询之后知道有Neoclipse这个可视化工具,最新版本是1.9.5.添加目录后报错: 应该是Neoclip ...

随机推荐

  1. linux系统平均负载高(load average)

    系统平均负载高(load average) 问题现象 两个案例都是:系统平均负载高,但cpu,内存,磁盘io都正常 什么是系统平均负载 平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进 ...

  2. PCIe引脚PRSNT与热插拔

    热插拔的基本目的是要让PCIe设备按照规定的顺序.原则,从系统中移除或插入到系统中来,并能正常的工作,且不影响系统的正常运行.事实上,PCIe"热插拔"的关键目的就是为前面面所提到 ...

  3. 常见排序算法的golang 实现

    五种基础排序算法对比 五种基础排序算法对比 1:冒泡排序 算法描述 比较相邻的元素.如果第一个比第二个大,就交换它们两个: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素 ...

  4. EFCore常规操作生成的SQL语句一览

    前言 EFCore的性能先不说,便捷性绝对是.Net Core平台下的ORM中最好用的,主要血统还百分百纯正. EFCore说到底还是对数据库进行操作,无论你是写Lamda还是Linq最后总归都是要生 ...

  5. linux篇-linux awstats搭建

    1安装lnmp模式 2安装awstats 2# tar xf awstats-6.5.tar.gz 解压下载到/root下的压缩包 mkdir /var/lib/awstats chmod 755 / ...

  6. 『忘了再学』Shell基础 — 21、变量的测试与内容置换

    目录 1.什么是变量的测试与内容置换 2.变量的测试与内容置换 3.示例 例1: 例2: 例3: 1.什么是变量的测试与内容置换 我们之前说过,在Shell中,一个变量未定义,和一个变量为空值的输出效 ...

  7. 「JOISC 2019 Day4」蛋糕拼接 3

    loj 3039 NKOJ Description \(n\)个蛋糕,每个蛋糕有\(w_i,h_i\).选\(m\)个蛋糕满足\(\sum\limits_{j=1}^mw_{k_j}-\sum\lim ...

  8. 面试常问的dubbo的spi机制到底是什么?

    前言 dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力.作为spring cloud alibaba体系中重要的一部分,随着spring cloud alibaba在 ...

  9. 解决python 导入selenium 库后自动化运行成功但是报错问题

    本章节开始进入自动化的基础教学了,首先我们要对我们的工具有一定的熟练使用程度,做自动化常用的工具一个是搭建 RobotFramework自动化框架,另外一个便是我们最常用的python 工作原理是比较 ...

  10. SpringCloudAlibaba分布式流量控制组件Sentinel实战与源码分析(上)

    概述 定义 Sentinel官网地址 https://sentinelguard.io/zh-cn/index.html 最新版本v1.8.4 Sentinel官网文档地址 https://senti ...