Neo4j学习3:Java连接图库并执行CQL

文章目录

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

    }
}
相关推荐
Lyyaoo.4 分钟前
【Java基础面经】Java 反射机制
java·开发语言·python
YXWik69 分钟前
Langchain4j(1)基础对话+连续对话+工具调用 + 流式响应+结构化 JSON 输出
java
沪漂阿龙17 分钟前
深度剖析神经网络学习:从损失函数到SGD,手写数字识别完整实战
人工智能·神经网络·学习
967720 分钟前
什么是 Thymeleaf?
java
迷路爸爸18021 分钟前
Docker 入门学习笔记 06:用一个可复现的 Python 项目真正理解 Dockerfile
笔记·学习·docker
Dream_sky分享26 分钟前
找类中字段属性不同工具类
java
ghie909026 分钟前
基于学习的模型预测控制(LBMPC)MATLAB实现指南
开发语言·学习·matlab
Engineer邓祥浩27 分钟前
JVM学习笔记(6) 第二部分 自动内存管理 第5章节 调优案例分析与实战
jvm·笔记·学习
givemeacar32 分钟前
SpringBoot3.3.0集成Knife4j4.5.0实战
java
十六年开源服务商37 分钟前
家庭装修公司网站方案策划2026
java·开发语言