图计算neo4j系列1-环境搭建和spring data neo4j

浏览: 1170

一. 环境安装

因为是学习,所以采用docker的方式:

docker pull neo4j:3.4

docker run -it --name neo4j -d -p 7474:7474 -p 7687:7687 neo4j:3.4

通过http://localhost:7474 访问,默认用户名密码是 neo4j/neo4j,初次登录需要更改用户名和密码,更改成功后,进入的界面如下:

image.png


二. 操作demo

选择使用spring neo4j,后续使用其他的方式。

1. pom.xml

<dependencies>
<!-- neo4j依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.voodoodyne.jackson.jsog</groupId>
<artifactId>jackson-jsog</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.3.3.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>

2. application.properties 配置文件

compiler=org.neo4j.ogm.compiler.MultiStatementCypherCompiler
driver=org.neo4j.ogm.drivers.http.driver.HttpDriver
URI=http://localhost:7474
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=****

3. 编写java bean

import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;

import java.util.Collections;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

/**
* https://spring.io/guides/gs/accessing-data-neo4j/
*/
@NodeEntity
public class Person {

@Id @GeneratedValue private Long id;

private String name;

private Person() {
// Empty constructor required as of Neo4j API 2.0.5
};

public Person(String name) {
this.name = name;
}

/**
* Neo4j doesn't REALLY have bi-directional relationships. It just means when querying
* to ignore the direction of the relationship.
* https://dzone.com/articles/modelling-data-neo4j
*/
@Relationship(type = "TEAMMATE", direction = Relationship.UNDIRECTED)
public Set<Person> teammates;

public void worksWith(Person person) {
if (teammates == null) {
teammates = new HashSet<>();
}
teammates.add(person);
}

public String toString() {

return this.name + "'s teammates => "
+ Optional.ofNullable(this.teammates).orElse(
Collections.emptySet()).stream()
.map(Person::getName)
.collect(Collectors.toList());
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

4. 编写dao

import com.am.neo4j.bean.Person;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface PersonRepository extends Neo4jRepository<Person, Long> {

Person findByName(String name);
List<Person> findByTeammatesName(String name);
}

5.编写spring启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

//开启自动配置
@EnableNeo4jRepositories
@EnableTransactionManagement
@SpringBootApplication
public class NeoApplication {
public static void main(String[] args) {
SpringApplication.run(NeoApplication.class, args);
}
}

三. 代码测试和效果

1.测试类

import com.am.neo4j.bean.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Arrays;
import java.util.List;


@RunWith(SpringRunner.class)
@SpringBootTest
public class DaoTest {

private static Logger logger= LoggerFactory.getLogger(DaoTest.class);

@Autowired
PersonRepository personRepository;

@Test
public void runData(){

personRepository.deleteAll();

Person greg = new Person("Greg");
Person roy = new Person("Roy");
Person craig = new Person("Craig");

List<Person> team = Arrays.asList(greg, roy, craig);

System.out.println("Before linking up with Neo4j...");

team.stream().forEach(person -> System.out.println("\t" + person.toString()));

personRepository.save(greg);
personRepository.save(roy);
personRepository.save(craig);

greg = personRepository.findByName(greg.getName());
greg.worksWith(roy);
greg.worksWith(craig);
personRepository.save(greg);

roy = personRepository.findByName(roy.getName());
roy.worksWith(craig);
// We already know that roy works with greg
personRepository.save(roy);

// We already know craig works with roy and greg

System.out.println("Lookup each person by name...");
team.stream().forEach(person -> System.out.println(
"\t" + personRepository.findByName(person.getName()).toString()));

List<Person> teammates = personRepository.findByTeammatesName(greg.getName());
System.out.println("The following have Greg as a teammate...");
teammates.stream().forEach(person -> System.out.println("\t" + person.getName()));
}

}

2.运行效果

image.png

推荐 0
本文由 平常心 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册