Neo4j程序访问
Neo4j数据库访问
Neo4j访问的两种方式
- 嵌入式数据库
- 服务器模式(通过REST的访问)
它是由应用程序的性质(neo4j是独立服务器 还是和程序在一起),性能,监控和数据安全性来决定架构选择。
An embedded database(嵌入式数据库)
嵌入式Neo4j数据库是性能的最佳选择。 通过指定数据存储的路径以编程方式访问嵌入式数据库。
我们选择嵌入式数据库出于以下原因:
- 使用Java作为我们项目的编程语言时
- 应用程序是独立的
程序追求很高的性能
Neo4j Server(服务器模式)
Neo4j Server是相互操作性,安全性和监控的最佳选择。 实际上,REST接口允许所有现代平台和编程语言与它进行互操作。 此外,作为独立应用程序,它比嵌入式配置更安全(客户端中的潜在故障不会影响服务器),并且更易于监控。 如果我们选择使用这种模式,我们的应用程序将充当Neo4j服务器的客户端。要连接到Neo4j服务器,可以使用任何编程语言的REST访问数据库。
Java客户端操作Neo4j
嵌入式模式
<dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j</artifactId> <version>3.5.5</version> </dependency>package com.neodemo; 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.neodemo; 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<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>package com.neodemo; 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.neodemo; 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

导入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.neodemo</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> <!--这个包默认使用了bolt协议--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency> <!--如果使用bolt协议可以不导入这个包,使用http协议和嵌入式方式必须导入这个包--> <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>建立实体类
package com.neodemo.bean; import org.neo4j.ogm.annotation.GeneratedValue; import org.neo4j.ogm.annotation.Id; import org.neo4j.ogm.annotation.NodeEntity; import org.neo4j.ogm.annotation.Property; @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; @Override public String toString() { return "Person{" + "id=" + id + ", pid=" + pid + ", name='" + name + '\'' + ", character='" + character + '\'' + ", money=" + money + ", gender=" + gender + ", age=" + age + ", description='" + description + '\'' + ", relationPersons=" + relationPersons + '}'; } public Person() { } public Person(Long id, String name, String character, double money, int gender, int age, String description) { this.id = id; this.name = name; this.character = character; this.money = money; this.gender = gender; this.age = age; this.description = description; } public Set<Person> getRelationPersons() { return relationPersons; } public void setRelationPersons(Set<Person> relationPersons) { this.relationPersons = relationPersons; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } 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 isGender() { return gender; } public void setGender(int gender) { this.gender = gender; } 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.neodemo.repository; import com.neodemo.bean.Person; import org.springframework.data.neo4j.annotation.Query; import org.springframework.data.neo4j.repository.Neo4jRepository; import org.springframework.stereotype.Repository; import java.util.*; @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编写服务类
package com.neodemo.service; import com.neodemo.bean.Person; import com.neodemo.repository.PersonRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @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); } }编写测试类
package com.neodemo; import com.neodemo.bean.Person; import com.neodemo.service.Neo4jPersonService; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import java.util.List; @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("王启年", "九品射手燕小乙")); } }
评论已关闭