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

    }
}
相关推荐
洛阳纸贵2 小时前
JAVA高级工程师--Springboot集成ES、MySQL同步ES的方案、ES分片副本、文档及分片规划
java·spring boot·elasticsearch
树码小子2 小时前
SpringMVC(13):总结
spring
爱吃泡芙的小白白2 小时前
深入权重之核:机器学习权重参数最新技术与实践全解析
人工智能·学习·机器学习
ajole2 小时前
Linux学习笔记——基本指令
linux·服务器·笔记·学习·centos·bash
渡我白衣2 小时前
无中生有——无监督学习的原理、算法与结构发现
人工智能·深度学习·神经网络·学习·算法·机器学习·语音识别
.小墨迹2 小时前
apollo中速度规划的s-t图讲解【针对借道超车的问题】
开发语言·数据结构·c++·人工智能·学习
阿猿收手吧!2 小时前
【C++】C++原子类型隐式转换解析
java·c++
追逐梦想的张小年2 小时前
JUC编程02
java·idea
HL_风神2 小时前
C++设计模式学习-工厂方法模式
c++·学习·设计模式