Neo4j的两种方式访问(嵌入式访问、服务器模式访问)-- java客户端连接和SpringBoot整合Neo4j

一、Neo4j数据库访问

1、Neo4j数据库访问

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

它是由应用程序的性质(neo4j是独立服务器 还是和程序在一起),性能,监控和数据安全性来决定架构选择。

2、An embedded database(嵌入式数据库)

嵌入式Neo4j数据库是性能的最佳选择。 通过指定数据存储的路径以编程方式访问嵌入式数据库。我们选择嵌入式数据库出于以下原因:
使用Java作为我们项目的编程语言时

  • 应用程序是独立的
  • 程序追求很高的性能

3、Neo4j Server(服务器模式)

Neo4j Server是相互操作性,安全性和监控的最佳选择。 实际上,REST接口允许所有现代平台和编程语言与它进行互操作。 此外,作为独立应用程序,它比嵌入式配置更安全(客户端中的潜在故障不会影响服务器),并且更易于监控。 如果我们选择使用这种模式,我们的应用程序将充当Neo4j服务器的客户端。要连接到Neo4j服务器,可以使用任何编程语言的REST 访问数据库。

二、Java客户端操作Neo4j

1、嵌入式模式

<dependency>
	<groupId>org.neo4j</groupId>
	<artifactId>neo4j</artifactId>
	<version>3.5.5</version>
</dependency>
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();
	}
}
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();
	}
}

2、服务器模式

<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();
	}
}

三、SpringBoot 整合Neo4j

在这里插入图片描述

1、导入jar

<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>

2、建立实体类

@NodeEntity
public class Person {
    @Id
    @GeneratedValue
    private 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;
    }

    @Override
    public 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;
    }
}

3、数据持久层

@Repository
public 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);
}

4、配置文件 application.yml

spring:
  data:
    neo4j:
      username: neo4j
      password: 123456
      uri:  bolt://localhost:7687

5、编写服务类

@Service("personService")
public class Neo4jPersonService {
    @Autowired
    private 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);
    }


}

6、编写测试类

@SpringBootApplication
public 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);
        }
    }
}