文章目录
Java库
neo4j-java-driver
概述
依赖(图数据库本身): https://mvnrepository.com/artifact/org.neo4j/neo4j
依赖(连接图数据库的工具,类似JDBC): https://mvnrepository.com/artifact/org.neo4j.driver/neo4j-java-driver
官方使用文档: https://neo4j.com/docs/java-manual/current/install/
作用: 官方自己写的一套图数据库连接查询Java工具

xml
<!-- Source: https://mvnrepository.com/artifact/org.neo4j.driver/neo4j-java-driver -->
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>6.0.2</version>
<scope>compile</scope>
</dependency>
简单使用
如有必要自行看上面的官方文档手册进行学习
neo4j-jdbc-full-bundle
概述
依赖(适配图数据库的JDBC实现版): https://mvnrepository.com/artifact/org.neo4j/neo4j-jdbc-full-bundle
官方使用文档: https://neo4j.com/docs/jdbc-manual/current/usage/
作用: 实现Java的JDBC接口

xml
<!-- Source: https://mvnrepository.com/artifact/org.neo4j/neo4j-jdbc-full-bundle -->
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-jdbc-full-bundle</artifactId>
<version>6.10.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.19.1</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.43</version>
</dependency>
简单使用
java
public class Neo4jTest {
@Test
@SneakyThrows
public void test1() {
Console.log("fdsfsdfsdf");
String rowName = "node";
var query = """
match (n)
where n.name contains 'linrc' and n.year is not null
return n as {}
order by n.year desc
skip 0 limit 2
""";
query = StrUtil.format(query, rowName);
var url = "jdbc:neo4j://localhost:7687/neo4j";
var username = "neo4j";
var password = "neo4jneo4j";
var con = DriverManager.getConnection(url, username, password);
var stmt = con.createStatement();
var result = stmt.executeQuery(query);
while (result.next()) {
JsonNode object = result.getObject(rowName, JsonNode.class);
Console.log(object);
}
}
}


spring-boot-starter-data-neo4j
概述
依赖(Spring官方进行二次封装): https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-neo4j
官方使用文档: https://docs.spring.io/spring-data/neo4j/reference/getting-started.html
作用: 实现Java-Spring框架进行连接查询图库

简单使用
数据准备
sql
create (person1:Person {name: 'linrc7',year:18})-[:TestTestColleagues {company:'测试测试电信总公司',remark:'备注'}]->(person2:Person {name: 'linrc8',year:19});
match (n)
where n.name in ['linrc7', 'linrc8']
return n;

前置准备
pom.xml
xml
<dependencies>
<!-- Source: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<!--<dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-data-jpa</artifactId>-->
<!-- <scope>compile</scope>-->
<!--</dependency>-->
<!-- Source: https://mvnrepository.com/artifact/org.neo4j.driver/neo4j-java-driver -->
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>5.28.10</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.19.1</version>
</dependency>
<!-- Source: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
SpringConfig.java
java
/**
* 需要配置neo4j事务,否则执行spring代码说缺事务,也不清楚为什么没有自动配置事务
*/
@Service
public class SpringConfig extends AbstractReactiveNeo4jConfig {
@Override
@Bean
public Configuration cypherDslConfiguration() {
return Configuration.newConfig()
.withDialect(Dialect.NEO4J_4).build();
}
@Bean
public ReactiveTransactionManager reactiveTransactionManager() {
return new ReactiveNeo4jTransactionManager(driver());
}
@Override
public Driver driver() {
// 配置Neo4j驱动
return GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "neo4jneo4j"));
}
}
方式1:自动化映射
注意事项: 务必务必务必将你设置的属性值类型 跟 Bean的属性类型,一一对应,否则会执行报错,映射错误啥的,排查很久数据里面的 数值类型,但JavaBean属性使用String接收,这特么也报错
PersonEntity.java
java
@Node("Person")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Accessors(chain = true)
public class PersonEntity implements Serializable {
@Id
@Property("name")
private String name;
@Property("year")
private Integer year;
// @Relationship(type = "TestTestColleaguesEntity", direction = Relationship.Direction.INCOMING)
// private List<TestTestColleaguesEntity> actorsAndRoles = new ArrayList<>();
}
PersonEntityRepository.java
java
public interface PersonEntityRepository extends ReactiveNeo4jRepository<PersonEntity, String> {
Mono<PersonEntity> findOneByName(String name);
}
Neo4jSpringStartApplicationTests.java
java
@SpringBootTest
public class Neo4jSpringStartApplicationTests {
@Autowired
PersonEntityRepository personEntityRepository;
@org.junit.jupiter.api.Test
public void test1() {
Mono<PersonEntity> personEntityMono = personEntityRepository.findOneByName("linrc7");
PersonEntity personEntity = personEntityMono.block();
Console.log(personEntity);
}
}



方式2:自定义执行CQL
参考文档: https://docs.spring.io/spring-data/neo4j/reference/appendix/neo4j-client.html
Neo4jNodeToJsonNodeConverter.java
java
public class Neo4jNodeToJsonNodeConverter {
public static JsonNode convert(InternalNode internalNode) {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> nodeMap = new HashMap<>();
// 添加节点ID
nodeMap.put("id", internalNode.id());
// 添加节点标签
nodeMap.put("labels", internalNode.labels());
// 添加节点属性
nodeMap.put("properties", internalNode.asMap());
try {
return objectMapper.valueToTree(nodeMap);
} catch (Exception e) {
throw new RuntimeException("Failed to convert InternalNode to JsonNode", e);
}
}
}
Neo4jSpringStartApplicationTests.java
java
@SpringBootTest
public class Neo4jSpringStartApplicationTests {
@Autowired
PersonEntityRepository personEntityRepository;
@Autowired
Driver driver;
@Autowired
ReactiveNeo4jClient reactiveNeo4jClient;
@org.junit.jupiter.api.Test
public void test2() {
Console.log("结果======\n");
String cql = """
match (n)
where n.name in ['linrc7', 'linrc8']
return n;
""";
ReactiveNeo4jClient.UnboundRunnableSpec queryResult = reactiveNeo4jClient.query(cql);
Flux<Map<String, Object>> allResultFlux = queryResult.fetch().all();
List<Map<String, Object>> result = allResultFlux.collectList().block();
List<Object> resultRows = result.stream()
.filter(ObjUtil::isNotEmpty)
.map(resultElem -> CollUtil.getFirst(resultElem.values()))
.map(nodeInfo -> Convert.convert(InternalNode.class, nodeInfo))
.map(Neo4jNodeToJsonNodeConverter::convert)
.collect(Collectors.toList());
resultRows.forEach(Console::log);
}
}

