赞
踩
S.No. | 功能 | 描述 |
---|---|---|
1 | UPPER | 它用于将所有字母更改为大写字母。 |
2 | LOWER | 它用于将所有字母改为小写字母。 |
3 | SUBSTRING | 它用于获取给定String的子字符串。 |
4 | REPLACE | 它用于替换一个字符串的子字符串。 |
MATCH (p:Person)
RETURN ID(p),LOWER(p.character)
match(p:Person)
return p.character,lower(p.character),
p.name,substring(p.name,2),replace(p.name,"子","z i")
S.No. | 聚集功能 | 描述 |
---|---|---|
1 | COUNT | 它返回由MATCH命令返回的行数。 |
2 | MAX | 它从MATCH命令返回的一组行返回最大值。 |
3 | MIN | 它返回由MATCH命令返回的一组行的最小值。 |
4 | SUM | 它返回由MATCH命令返回的所有行的求和值。 |
5 | AVG | 它返回由MATCH命令返回的所有行的平均值。 |
MATCH (p:Person)
RETURN MAX(p.money),SUM(p.money)
S.No. | 功能 | 描述 |
---|---|---|
1 | STARTNODE | 它用于知道关系的开始节点。 |
2 | ENDNODE | 它用于知道关系的结束节点。 |
3 | ID | 它用于知道关系的ID。 |
4 | TYPE | 它用于知道字符串表示中的一个关系的TYPE。 |
match p = (:Person {name:"林婉儿"})-[r:Couple]-(:Person)
RETURN STARTNODE(r)
MATCH p=shortestPath( (node1)-[*]-(node2) ) RETURN length(p), nodes(p)
MATCH p=shortestPath((person:Person {name:"王启年"})-[*]-(person2:Person {name:"九品射手燕小乙"}) ) RETURN length(p), nodes(p)
查询三层级关系节点如下: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
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
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
match (na:Person)-[re]-(nb:Person) where na.name="林婉儿" WITH na,re,nb match (nb:Person)-
[re2:Friends]->(nc:Person) return na,re,nb,re2,nc
match (na:Person{name:"范闲"})-[re]->(nb:Person)-[re2]->(nc:Person) return na,re,nb,re2,nc
为了方便,可以将查询结果赋给变量,然后返回
match data=(na:Person{name:"范闲"})-[re]->(nb:Person)-[re2]->(nc:Person) return data
当实现多深度关系节点查询时,显然使用以上方式比较繁琐。
可变数量的关系->节点可以使用-[:TYPE*minHops…maxHops]-。
查询:
match data=(na:Person{name:"范闲"})-[*1..2]-(nb:Person) return data
为了保持数据的完整性和保证良好的事务行为,Neo4j也支持ACID特性 。
注意:
Neo4j CQL支持节点或关系属性上的索引,以提高应用程序的性能。
可以为具有相同标签名称的属性上创建索引。
可以在MATCH或WHERE等运算符上使用这些索引列来改进CQL 的执行。
CREATE INDEX ON :Label(property)
例如:
CREATE INDEX ON :Person(name)
CREATE INDEX ON :Person(age, gender)
之前的常规模式索引只能对字符串进行精确匹配或者前后缀索引(startswith,endswith,contains),全文索引将标记化索引字符串值,因此它可以匹配字符串中任何位置的术语。索引字符串如何被标记化并分解为术语,取决于配置全文模式索引的分析器。索引是通过属性来创建,便于快速查找节点或者关系。
创建和配置全文模式索引
使用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
call db.indexes 或者 :schema
DROP INDEX ON :Person(name)
DROP INDEX ON :Person(age, gender)
call db.index.fulltext.drop("nameAndDescription")
作用
创建唯一性约束
CREATE CONSTRAINT ON (变量:<label_name>) ASSERT 变量.<property_name> IS UNIQUE
具体实例:
CREATE CONSTRAINT ON (person:Person) ASSERT person.name IS UNIQUE
删除唯一性约束
DROP CONSTRAINT ON (cc:Person) ASSERT cc.name IS UNIQUE
CREATE CONSTRAINT ON (p:Person) ASSERT exists(p.name)
call db.constraints :schema
在对Neo4j数据进行备份、还原、迁移的操作时,首先要关闭neo4j
./bin/neo4j stop
数据备份到文件
./bin/neo4j-admin dump --database=graph.db --to=/root/qyn.dump
还原、迁移之前 ,关闭neo4j服务。操作同上
./bin/neo4j-admin load --from=/root/qyn.dump --database=graph.db --force
重启服务
./bin/neo4j start
注意,运行数据备份可能会警告
WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j manual
编辑这个文件
vi /etc/security/limits.conf
在文件最后加入下面这段 修改最大打开文件限制
* soft nofile 65535
* hard nofile 65535
重启服务器
再次执行上面的步骤 警告就没有了
增加服务器内存 和 调整neo4j配置文件
# java heap 初始值
dbms.memory.heap.initial_size=1g
# java heap 最大值,一般不要超过可用物理内存的80%
dbms.memory.heap.max_size=16g
# pagecache大小,官方建议设为:(总内存-dbms.memory.heap.max_size)/2, dbms.memory.pagecache.size=2g
neo4j刚启动数据是冷的需要预热
MATCH (n) OPTIONAL MATCH (n)-[r]->()
RETURN count(n.name) + count(r);
查看执行计划进行索引优化
Cypher查询计划程序将每个查询转换为执行计划。 执行计划告诉Neo4j在执行查询时要执行哪些操作。
对执行计划的生成,Neo4j使用的都是基于成本的优化器(Cost Based Optimizer,CBO),用于制订精确的执行过程。可以采用如下两种不同的方式了解其内部的工作机制:
EXPLAIN:是解释机制,加入该关键字的Cypher语句可以预览执行的过程但并不实际执行,所以也不会产生任何结果。
PROFILE:则是画像机制,查询中使用该关键字,不仅能够看到执行计划的详细内容,也可以看到查询的执行结果。
关注指标:
estimated rows: 需要被扫描行数的预估值
dbhits: 实际运行结果的命中绩效
两个值都是越小越好
使用索引和不使用索引对比
MATCH (p { name : ‘范闲’ }) RETURN p
在之前加上profile来进行查询,可以查看查询计划
它是由应用程序的性质(neo4j是独立服务器 还是和程序在一起),性能,监控和数据安全性来决定架构选择。
嵌入式Neo4j数据库是性能的最佳选择。 通过指定数据存储的路径以编程方式访问嵌入式数据库。
我们选择嵌入式数据库出于以下原因:
Neo4j Server是相互操作性,安全性和监控的最佳选择。 实际上,REST接口允许所有现代平台和编程语言与它进行互操作。 此外,作为独立应用程序,它比嵌入式配置更安全(客户端中的潜在故障不会影响服务器),并且更易于监控。 如果我们选择使用这种模式,我们的应用程序将充当Neo4j服务器的客户端。要连接到Neo4j服务器,可以使用任何编程语言的REST 访问数据库。
引入依赖
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j</artifactId>
<version>3.5.5</version>
</dependency>
新增 Java代码
public class EmbeddedNeo4jAdd {
private static final File databaseDirectory = new File( "target/graph.db" );
public static void main(String[] args) {
GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(databaseDirectory);
System.out.println("Database Load!");
Transaction tx = graphDb.beginTx();
Node n1 = graphDb.createNode();
n1.setProperty("name", "张三");
n1.setProperty("character", "A");
n1.setProperty("gender",1);
n1.setProperty("money", 1101);
n1.addLabel(new Label() {
@Override
public String name() {
return "Person";
}
});
String cql = "CREATE (p:Person{name:'李四',character:'B',gender:1,money:21000})";
graphDb.execute(cql);
tx.success();
tx.close();
System.out.println("Database Shutdown!");
graphDb.shutdown();
}
}
查询所有Java代码
public class EmbeddedNeo4jQueryAll {
private static final File databaseDirectory = new File( "target/graph.db" );
public static void main(String[] args) {
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<String, Object>();
paramerters.put("money", 25000);
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.getProperty("name"),nd.getProperty("money"));
}
}
tx.success();
tx.close();
System.out.println("Database Shutdown!");
graphDb.shutdown();
}
}
依赖
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-bolt-driver</artifactId>
<version>3.2.10</version>
</dependency>
代码
public class Neo4jServerMain {
public static void main(String[] args) {
Driver driver = GraphDatabase.driver( "bolt://127.0.0.1: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,parameters( "money", 1000 ) );
while ( result.hasNext() ) {
Record record = result.next();
System.out.println( record.get( "name" ).asString() + " " + record.get( "money" ).asDouble() );
}
session.close();
driver.close();
}
}
public class Neo4jServerMain2 {
public static void main(String[] args) {
Driver driver = GraphDatabase.driver( "bolt://127.0.0.1:7687", AuthTokens.basic( "neo4j", "123456" ) );
Session session = driver.session();
String cql = "MATCH p=shortestPath((person:Person {name:$startName})- [*]-(person2:Person {name:$endName} )) RETURN p";
Result result = session.run( cql,parameters("startName","王启 年","endName","九品射手燕小乙") );
while ( result.hasNext() ) {
Record record = result.next();
System.out.println(record);
}
session.close();
driver.close();
}
}
导入jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.learn</groupId>
<artifactId>neo4j_springboot_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF- 8</project.reporting.outputEncoding>
<java.version>1.11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-bolt-driver</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
建立实体类(get、set和ToString方法省略)
@NodeEntity
public class Person {
@Id @GeneratedValue
private Long id;
@Property("cid")
private int pid;
@Property
private String name;
private String character;
private double money;
private int gender;
private int age;
private String description;
@Relationship(type = "Friends",direction = Relationship.INCOMING)
private Set<Person> relationPersons;
数据持久化类
@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..4]- (person2:Person {name:{1}}) ) RETURN p")
List<Person> shortestPath(String startName,String endName);
}
或者使用
@Query("match(p:Person) where p.money>{money} return p")
List<Person> personList(@Param("money") double money);
/** 指定开始的名字 和 结束的名字 查询最短路径 限定深度为4以层包含4*/
@Query("match p=shortestPath((person:Person{name:{startName}})-[*1..4]- (person2:Person {name:{endName}})) return p")
List<Person> shortestPath(@Param("startName") String startName,@Param("endName") String endName);
配置文件 application.yml
spring:
data:
neo4j:
username: neo4j
password: 123456
uri: bolt://192.168.211.133:7687
#uri: http://192.168.211.133:7474
#uri: file:///target/graph.db
编写服务类
@Service
public class Neo4jPersonService {
@Autowired private PersonRepository personRepository;
public List<Person> personList(){
return personRepository.personList();
}
public Person save(Person person){
return personRepository.save(person);
}
public List<Person> shortestPath(String startName, String endName){
return personRepository.shortestPath(startName,endName);
}
编写测试类
@SpringBootApplication
public class TestNeo4jBootApp {
public static void main(String[] args) {
ApplicationContext app = SpringApplication.run(TestNeo4jBootApp.class,args);
Neo4jPersonService personService = app.getBean(Neo4jPersonService.class);
System.out.println(personService);
List<Person> datas = personService.personListAll();
System.out.println(datas);
System.out.println(personService. shortestPath("王启年", "九品射手燕小 乙"));
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。