Neo4j访问的两种方式
嵌入式数据库
服务器模式(通过REST的访问)
它是由应用程序的性质(neo4j是独立服务器 还是和程序在一起),性能,监控和数据安全性来决定架构选择。
An embedded database(嵌入式数据库)
嵌入式Neo4j数据库是性能的最佳选择。 通过指定数据存储的路径以编程方式访问嵌入式数据库。
我们选择嵌入式数据库出于以下原因:
- 使用Java作为我们项目的编程语言时
- 应用程序是独立的
- 程序追求很高的性能
Neo4j Server(服务器模式)
Neo4j Server是相互操作性,安全性和监控的最佳选择。 实际上,REST接口允许所有现代平台和编程语言与它进行互操作。 此外,作为独立应用程序,它比嵌入式配置更安全(客户端中的潜在故障不会影响服务器),并且更易于监控。 如果我们选择使用这种模式,我们的应用程序将充当Neo4j服务器的客户端。要连接到Neo4j服务器,可以使用任何编程语言的REST 访问数据库。Java客户端操作Neo4j
嵌入式模式
org.neo4j neo4j 3.5.5
package com.lagou; import org.neo4j.graphdb.*; import org.neo4j.graphdb.factory.GraphDatabaseFactory; import java.io.File; import java.util.HashMap; import java.util.Map; 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();
}
}
package com.lagou;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
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
paramerters = new HashMap (); paramerters.put(“money”, 25000);
Transaction tx = graphDb.beginTx();
Result result = graphDb.execute(cql,paramerters);
while (result.hasNext()) {
Map
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();
}
}
服务器模式
org.neo4j neo4j-ogm-bolt-driver 3.2.10
package com.lagou;
import org.neo4j.driver.*;
import static org.neo4j.driver.Values.parameters;
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();
}
}
package com.lagou;
import org.neo4j.driver.*;
import static org.neo4j.driver.Values.parameters;
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();
}
}
SpringBoot 整合Neo4j
pom.xml配置
<?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.lagou</groupId><artifactId>springboot_neo4j_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><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></project>
创建实体类
package com.lagou.bean;import org.neo4j.ogm.annotation.*;import java.util.Set;@NodeEntitypublic class Person {@Id@GeneratedValueprivate Long id;@Property("cid")private int pid;private String name;private String character;private double money;private int age;private String description;@Relationship(type = "Friends",direction = Relationship.OUTGOING)private Set<Person> friendsPerson;public Set<Person> getFriendsPerson() {return friendsPerson;}public void setFriendsPerson(Set<Person> friendsPerson) {this.friendsPerson = friendsPerson;}public Person(Long id, int pid, String name, String character, double money, int age, String description) {this.id = id;this.pid = pid;this.name = name;this.character = character;this.money = money;this.age = age;this.description = description;}public Person() {}public Long getId() {return id;}@Overridepublic String toString() {return "Person{" +"id=" + id +", pid=" + pid +", name='" + name + '\'' +", character='" + character + '\'' +", money=" + money +", age=" + age +", description='" + description + '\'' +", friendsPerson=" + friendsPerson +'}';}public void setId(Long id) {this.id = id;}public int getPid() {return pid;}public void setPid(int pid) {this.pid = pid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCharacter() {return character;}public void setCharacter(String character) {this.character = character;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}}
数据持久化类
package com.lagou.repository;import com.lagou.bean.Person;import org.springframework.data.neo4j.annotation.Query;import org.springframework.data.neo4j.repository.Neo4jRepository;import org.springframework.data.repository.query.Param;import org.springframework.stereotype.Repository;import java.util.List;@Repositorypublic interface PersonRepository extends Neo4jRepository<Person,Long> {/** 查看money 大于指定值的Person 列表 *///@Query("match(p:Person) where p.money>{0} return p")@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);@Query("match p =(person:Person {name:{name}})-[*1..2]-(:Person) return p")List<Person> personListDept(@Param("name") String name);}
配置文件 application.yml
spring:data:neo4j:username: neo4jpassword: 123456uri: bolt://192.168.211.133:7687
编写服务类
package com.lagou.service;import com.lagou.bean.Person;import com.lagou.repository.PersonRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.ArrayList;import java.util.List;@Service("personService")public class Neo4jPersonService {@Autowiredprivate PersonRepository personRepository;public List<Person> getAll(){List<Person> datas = new ArrayList<>();personRepository.findAll().forEach(person -> datas.add(person));return datas;}public Person save(Person person){return personRepository.save(person);}public List<Person> personList(double money){return personRepository.personList(money);}public List<Person> shortestPath(String startName,String endName){return personRepository.shortestPath(startName,endName);}public List<Person> personListDept(String name){return personRepository.personListDept(name);}}
编写测试类
package com.lagou;import com.lagou.bean.Person;import com.lagou.service.Neo4jPersonService;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationContext;import java.util.List;@SpringBootApplicationpublic class Neo4jBootAppMain {public static void main(String[] args) {ApplicationContext applicationContext = SpringApplication.run(Neo4jBootAppMain.class,args);Neo4jPersonService personService = applicationContext.getBean("personService",Neo4jPersonService.class);Person person = new Person();person.setName("testboot");person.setMoney(12345.45);person.setCharacter("A");person.setAge(11);Person p1 = personService.save(person);System.out.println(p1);System.out.println(personService.getAll());List<Person> personList = personService.personList(1000);System.out.println(personList);List<Person> personList2 = personService.shortestPath("王启年","九品射手燕小乙");System.out.println(personList2);List<Person> personList3 = personService.personListDept("范闲");for (Person pe:personList3){System.out.println(pe);}}}
