参考文档

  官方文档

  • http://spring.io/projects/spring-data-neo4j#learn
  • https://docs.spring.io/spring-data/neo4j/docs/5.1.2.RELEASE/reference/html/
  • https://neo4j.com/docs/
  • https://neo4j.com/docs/developer-manual/current/

安装 maven 包



spring boot 2.0 neo4j 使用_SpringBoot


<dependency>

  <groupId>org.neo4j</groupId>

  <artifactId>neo4j-ogm-http-driver</artifactId>

  <version>3.1.4</version>

</dependency>

<dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-data-neo4j</artifactId>

  <version>2.1.0.RELEASE</version>

</dependency>


spring boot 2.0 neo4j 使用_DB_02


添加 neo4j 配置

application.yml



spring:
data:
neo4j:
username: neo4j
password: 1234
uri: http://172.16.235.175:7474


添加配置类



spring boot 2.0 neo4j 使用_java经验集锦_03

@Configuration
@EnableNeo4jRepositories(basePackages = "com.example.demo.repository")
@EnableTransactionManagement
public class Neo4jConfig {
@Value(</span>"${spring.data.neo4j.uri}"<span style="color: #000000;">)
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String databaseUrl;

@Value(</span>"${spring.data.neo4j.username}"<span style="color: #000000;">)
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String userName;

@Value(</span>"${spring.data.neo4j.password}"<span style="color: #000000;">)
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String password;

@Bean
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> SessionFactory sessionFactory() {
org.neo4j.ogm.config.Configuration configuration </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> org.neo4j.ogm.config.Configuration.Builder()
.uri(databaseUrl)
.credentials(userName, password)
.build();
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> SessionFactory(configuration, "com.example.demo.entity"<span style="color: #000000;">);
}

@Bean
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Neo4jTransactionManager transactionManager() {
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Neo4jTransactionManager(sessionFactory());
}


}


spring boot 2.0 neo4j 使用_java经验集锦_04


添加 Neo4j 节点类



spring boot 2.0 neo4j 使用_java经验集锦_05

@NodeEntity
public class SGNode {
private Long count;
private Long error;
private Double max;
private Double min;
</span><span style="color: #008000;">/**</span><span style="color: #008000;">
* Neo4j会分配的ID(节点唯一标识 当前类中有效)
</span><span style="color: #008000;">*/</span><span style="color: #000000;">
@Id
@GeneratedValue
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Long id;

</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String name;

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Long getId() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> id;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setId(Long id) {
</span><span style="color: #0000ff;">this</span>.id =<span style="color: #000000;"> id;
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name) {
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}

@Relationship(type </span>= "call"<span style="color: #000000;">)
</span><span style="color: #0000ff;">private</span> List<CallRelation><span style="color: #000000;"> calls;

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> SGNode() {
count </span>= 0L<span style="color: #000000;">;
error </span>= 0L<span style="color: #000000;">;
max </span>= 0.0<span style="color: #000000;">;
min </span>= 0.0<span style="color: #000000;">;
calls </span>= <span style="color: #0000ff;">new</span> ArrayList<><span style="color: #000000;">();
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> SGNode(String name) {
</span><span style="color: #0000ff;">this</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Long getCount() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> count;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setCount(Long count) {
</span><span style="color: #0000ff;">this</span>.count =<span style="color: #000000;"> count;
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Long getError() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> error;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setError(Long error) {
</span><span style="color: #0000ff;">this</span>.error =<span style="color: #000000;"> error;
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Double getMax() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> max;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setMax(Double max) {
</span><span style="color: #0000ff;">this</span>.max =<span style="color: #000000;"> max;
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Double getMin() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> min;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setMin(Double min) {
</span><span style="color: #0000ff;">this</span>.min =<span style="color: #000000;"> min;
}

</span><span style="color: #0000ff;">public</span> List<CallRelation><span style="color: #000000;"> getCalls() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> calls;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setCalls(List<CallRelation><span style="color: #000000;"> calls) {
</span><span style="color: #0000ff;">this</span>.calls =<span style="color: #000000;"> calls;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> addCalls(SGNode node, Long count) {
CallRelation relation </span>= <span style="color: #0000ff;">new</span> CallRelation(<span style="color: #0000ff;">this</span><span style="color: #000000;">, node, count);
</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.calls.add(relation);
}


}


spring boot 2.0 neo4j 使用_通用实践_06


添加 Neo4j 关系类



spring boot 2.0 neo4j 使用_SpringBoot_07

@RelationshipEntity(type = "call")
public class CallRelation {
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CallRelation() {
</span><span style="color: #0000ff;">this</span>.name = "call"<span style="color: #000000;">;
}


</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CallRelation(SGNode start, SGNode end, Long count) {
</span><span style="color: #0000ff;">this</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">this</span>.startNode =<span style="color: #000000;"> start;
</span><span style="color: #0000ff;">this</span>.endNode =<span style="color: #000000;"> end;
</span><span style="color: #0000ff;">this</span>.count =<span style="color: #000000;"> count;
}

</span><span style="color: #008000;">/**</span><span style="color: #008000;">
* Neo4j会分配的ID(节点唯一标识 当前类中有效)
</span><span style="color: #008000;">*/</span><span style="color: #000000;">
@Id
@GeneratedValue
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Long id;

</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String name;

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Long getId() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> id;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setId(Long id) {
</span><span style="color: #0000ff;">this</span>.id =<span style="color: #000000;"> id;
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name) {
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}

</span><span style="color: #008000;">/**</span><span style="color: #008000;">
* 定义关系的起始节点 == StartNode
</span><span style="color: #008000;">*/</span><span style="color: #000000;">

@StartNode
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SGNode startNode;

</span><span style="color: #008000;">/**</span><span style="color: #008000;">
* 定义关系的终止节点 == EndNode
</span><span style="color: #008000;">*/</span><span style="color: #000000;">

@EndNode
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SGNode endNode;


</span><span style="color: #008000;">/**</span><span style="color: #008000;">
* 定义关系的属性
</span><span style="color: #008000;">*/</span><span style="color: #000000;">

@Property(name </span>= "count"<span style="color: #000000;">)
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Long count;

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> SGNode getStartNode() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> startNode;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setStartNode(SGNode startNode) {
</span><span style="color: #0000ff;">this</span>.startNode =<span style="color: #000000;"> startNode;
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> SGNode getEndNode() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> endNode;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setEndNode(SGNode endNode) {
</span><span style="color: #0000ff;">this</span>.endNode =<span style="color: #000000;"> endNode;
}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Long getCount() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> count;
}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setCount(Long count) {
</span><span style="color: #0000ff;">this</span>.count =<span style="color: #000000;"> count;
}


}


spring boot 2.0 neo4j 使用_DB_08


添加 Reponsitory



@Repository
public interface SGNodeReponsitory extends Neo4jRepository<SGNode, Long> {
  // 此处用法可见 https://docs.spring.io/spring-data/neo4j/docs/5.1.2.RELEASE/reference/html/#_query_methods
SGNode findByName(@Param("name") String name);
}


使用 Demo



spring boot 2.0 neo4j 使用_SQL_09

@RestController
@RequestMapping("/sg")
public class SGNodeController {
@Autowired
SGNodeReponsitory sgNodeReponsitory;

@DeleteMapping(</span>"/delete"<span style="color: #000000;">)
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String delete() {
sgNodeReponsitory.deleteAll();
</span><span style="color: #0000ff;">return</span> "OK"<span style="color: #000000;">;
}

@GetMapping(</span>"/add"<span style="color: #000000;">)
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String add() {
addNodes();
</span><span style="color: #0000ff;">return</span> "OK"<span style="color: #000000;">;
}

@GetMapping(</span>"/get"<span style="color: #000000;">)
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String relation() {
SGNode node </span>= sgNodeReponsitory.findByName("tsp"<span style="color: #000000;">);
List</span><Long> ids = <span style="color: #0000ff;">new</span> ArrayList<><span style="color: #000000;">();
ids.add(node.getId());
Iterable</span><SGNode> result = sgNodeReponsitory.findAllById(ids, 1<span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span> "OK"<span style="color: #000000;">;
}


</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> addNodes() {
sgNodeReponsitory.deleteAll();

List</span><SGNode> list = <span style="color: #0000ff;">new</span> ArrayList<><span style="color: #000000;">();

SGNode node </span>= <span style="color: #0000ff;">new</span> SGNode("tsp"<span style="color: #000000;">);
list.add(node);

</span><span style="color: #0000ff;">for</span> (Integer i = 1; i <= 10; i++<span style="color: #000000;">) {
node </span>= <span style="color: #0000ff;">new</span> SGNode("tsp" +<span style="color: #000000;"> i);
node.setCount(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
node.setError(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
node.setMax(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextDouble());
node.setMin(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextDouble());
list.add(node);
}

sgNodeReponsitory.saveAll(list);

SGNode start </span>= sgNodeReponsitory.findByName("tsp1"<span style="color: #000000;">);
SGNode end </span>= sgNodeReponsitory.findByName("tsp"<span style="color: #000000;">);
start.addCalls(end, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
sgNodeReponsitory.save(start);

start </span>= sgNodeReponsitory.findByName("tsp2"<span style="color: #000000;">);
end </span>= sgNodeReponsitory.findByName("tsp"<span style="color: #000000;">);
start.addCalls(end, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
sgNodeReponsitory.save(start);

start </span>= sgNodeReponsitory.findByName("tsp9"<span style="color: #000000;">);
end </span>= sgNodeReponsitory.findByName("tsp7"<span style="color: #000000;">);
start.addCalls(end, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
sgNodeReponsitory.save(start);

start </span>= sgNodeReponsitory.findByName("tsp7"<span style="color: #000000;">);
end </span>= sgNodeReponsitory.findByName("tsp2"<span style="color: #000000;">);
start.addCalls(end, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
sgNodeReponsitory.save(start);

start </span>= sgNodeReponsitory.findByName("tsp2"<span style="color: #000000;">);
end </span>= sgNodeReponsitory.findByName("tsp8"<span style="color: #000000;">);
start.addCalls(end, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
sgNodeReponsitory.save(start);

start </span>= sgNodeReponsitory.findByName("tsp"<span style="color: #000000;">);
end </span>= sgNodeReponsitory.findByName("tsp3"<span style="color: #000000;">);
start.addCalls(end, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
sgNodeReponsitory.save(start);

start </span>= sgNodeReponsitory.findByName("tsp"<span style="color: #000000;">);
end </span>= sgNodeReponsitory.findByName("tsp4"<span style="color: #000000;">);
start.addCalls(end, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
sgNodeReponsitory.save(start);

start </span>= sgNodeReponsitory.findByName("tsp6"<span style="color: #000000;">);
end </span>= sgNodeReponsitory.findByName("tsp3"<span style="color: #000000;">);
start.addCalls(end, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
sgNodeReponsitory.save(start);

start </span>= sgNodeReponsitory.findByName("tsp3"<span style="color: #000000;">);
end </span>= sgNodeReponsitory.findByName("tsp5"<span style="color: #000000;">);
start.addCalls(end, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
sgNodeReponsitory.save(start);

start </span>= sgNodeReponsitory.findByName("tsp5"<span style="color: #000000;">);
end </span>= sgNodeReponsitory.findByName("tsp10"<span style="color: #000000;">);
start.addCalls(end, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().nextLong());
sgNodeReponsitory.save(start);
}


}


spring boot 2.0 neo4j 使用_DB_10


执行 Add 操作之后 

spring boot 2.0 neo4j 使用_通用实践_11