国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

springboot整合neo4j-使用原生cypher

這篇具有很好參考價值的文章主要介紹了springboot整合neo4j-使用原生cypher。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

該文的實現(xiàn)有更簡單的方式,詳見我的另一篇博客springboot整合neo4j–采用Neo4jClient和Neo4jTemplate方式

1.背景

Neo4j 提供 JAVA API 以編程方式執(zhí)行所有數(shù)據(jù)庫操作。它支持三種類型的API:
1、Neo4j 原生的 Java API
原生 Java API 是一種低級別的純 JAVA API,用于執(zhí)行數(shù)據(jù)庫操作。
2、Neo4j Cypher Java API
Cypher Java API 是簡單而強大的 JAVA API,用于執(zhí)行所有CQL命令以執(zhí)行數(shù)據(jù)庫操作。
3、Neo4j OGM JAVA API
OGM Java API和Mybatis、JPA類似可以直接和SpringData整合

2.分析

目前很多項目針對neo4j的操作采用Neo4j OGM JAVA API,該方案與springboot整合之后可以使用@Query注解很方便的編寫查詢接口,比如這篇SpringBoot集成neo4j實戰(zhàn)。
但是這種方式對圖數(shù)據(jù)庫的增刪改查均依賴業(yè)務(wù)數(shù)據(jù)對象(就是你的Java bean對象,比如People、Company),如果我們數(shù)據(jù)類型很多且不斷變化,那這種方式就不再適合。
Neo4j Cypher Java API對neo4j的操作是業(yè)務(wù)數(shù)據(jù)對象無關(guān)的,不管是什么樣的節(jié)點數(shù)據(jù)或關(guān)系數(shù)據(jù)均可以操作。因為它是直接使用session執(zhí)行cyhper語句。具體區(qū)別可自行查看下方代碼。

3.代碼實戰(zhàn)

1.依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>chaos</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.0</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-neo4j</artifactId>
            <!--<exclusions>
                <exclusion>
                    <artifactId>neo4j-java-driver</artifactId>
                    <groupId>org.neo4j.driver</groupId>
                </exclusion>
            </exclusions>-->
        </dependency>
      <!--  <dependency>
            <groupId>org.neo4j.driver</groupId>
            <artifactId>neo4j-java-driver</artifactId>
            <version>4.2.0</version>
        </dependency>-->
        
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources</directory>
                <excludes>
                    <!--<exclude>**/*</exclude>-->
                </excludes>
            </resource>
        </resources>

    </build>



</project>

1.Neo4jClientConfig

package com.dbs.neo4j.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
@ConfigurationProperties(prefix = "com.dbs.neo4j")
public class Neo4jClientConfig {
    private String uri;
    private String username;
    private String password;
}

**2.Neo4jClientService **

package com.win.chaos.service;

import com.win.chaos.config.Neo4jConfig;
import com.win.chaos.exception.Neo4jException;
import lombok.extern.slf4j.Slf4j;
import org.neo4j.driver.*;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class Neo4jClientService {

    private final Driver driver;

    public Neo4jClientService(Neo4jConfig neo4jConfig) {
        this.driver = GraphDatabase.driver(neo4jConfig.getUri(), AuthTokens.basic(neo4jConfig.getUsername(), neo4jConfig.getPassword()));
    }

    /**
     * 適用執(zhí)行寫邏輯
     * @param cypher cypher
     * @return Result 由于return之前session已經(jīng)被關(guān)閉,該result不能被消費
     * @throws Neo4jException 執(zhí)行cypher出現(xiàn)異常
     */
    public Result run(String cypher) throws Neo4jException {
        Session session = driver.session();
        Transaction ts = session.beginTransaction();
        try {
            Result result = ts.run(cypher);
            ts.commit();
            return result;
        } catch (Exception e) {
            ts.rollback();
            log.error("run neo4j cypher error with ", e);
            throw new Neo4jException("run " + cypher + " error with" + e.getMessage());
        }finally {
            ts.close();
            session.close();
        }
    }

    /**
     * 用于執(zhí)行讀或?qū)慶ypher語句
     * @param gql cypher
     * @return Result
     * @throws Neo4jException 執(zhí)行cypher出現(xiàn)異常
     */
    public Result exec(String gql) throws Neo4jException {
        try {
            Session session = driver.session();
            log.info("exec {}", gql);
            return session.run(gql);
        } catch (Exception e) {
            log.error("execute gql {} error ", gql, e);
            throw new Neo4jException("execute " + gql + " error with" + e.getMessage());
        }
    }
}

3.Controller

	@Resource 
	private Neo4jClientService  neo4jClient;

	//查詢節(jié)點
    @GetMapping("/getNode")
    public Neo4jGraph getNode() throws Neo4jException {
        String ql = "MATCH (n:`公司`) RETURN n LIMIT 25";
        Result result = neo4jClient.run(ql);
        return Neo4jGraph.parse(result);
    }
    //查詢路徑
    @GetMapping("/matchPath")
    public Neo4jGraph matchPath() throws Neo4jException {
        String ql = "MATCH p=()-[r:`持股`]->() RETURN p LIMIT 25";
        Result result = neo4jClient.run(ql);
        return Neo4jGraph.parse(result);
    }
    //測試創(chuàng)建和刪除
    @GetMapping("/test")
    public void add() throws Neo4jException {
        String addQL = "CREATE (o:people {name:\"里斯\",id:32435})";
        Result addResult = neo4jClient.run(addQL);

        String delQL = "match (n:people) delete n";
        Result delResult = neo4jClient.run(delQL);
    }

以上代碼實現(xiàn)了springboot整合neo4j原生cypher,可以進行業(yè)務(wù)數(shù)據(jù)對象無關(guān)的操作。
代碼中的Neo4jGraph.parse為解析查詢對象接口。如有需要請看下面代碼。
4.Neo4jGraph

package com.win.chaos.model.neo4j;

import cn.hutool.core.collection.ConcurrentHashSet;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.neo4j.driver.Record;
import org.neo4j.driver.Result;
import org.neo4j.driver.Value;
import org.neo4j.driver.internal.types.TypeConstructor;
import org.neo4j.driver.types.Node;
import org.neo4j.driver.types.Path;
import org.neo4j.driver.types.Relationship;
import org.neo4j.driver.types.Type;
import java.util.List;
import java.util.Set;

@Data
@Slf4j
public class Neo4jGraph {
    private Set<Neo4jNode> nodes = new ConcurrentHashSet<>();
    private Set<Neo4jEdge> edges = new ConcurrentHashSet<>();

    /**
     * 解析查詢結(jié)果,目前僅解析節(jié)點(Node)、關(guān)系(Relationship)、路徑(Path)三種查詢結(jié)果類型
     * @param result 查詢結(jié)果集
     * @return Neo4jGraph
     */
    public static Neo4jGraph parse(Result result) {
        if (result == null) return null;
        Neo4jGraph graph = new Neo4jGraph();
        List<Record> records = result.list();
        for (Record record:records){
            List<Value> values = record.values();
            for (Value value : values) {
                Type type = value.type();
                if (type.name().equals(TypeConstructor.NODE.name())) {
                    Node node = value.asNode();
                    graph.addNeo4jNode(new Neo4jNode(node));
                }else if (type.name().equals(TypeConstructor.PATH.name())) {
                    Path path = value.asPath();
                    path.nodes().forEach(node -> graph.addNeo4jNode(new Neo4jNode(node)));
                    path.relationships().forEach(relationship -> graph.addNeo4jEdge(new Neo4jEdge(relationship)));
                }else if (type.name().equals(TypeConstructor.RELATIONSHIP.name())) {
                    Relationship relationship = value.asRelationship();
                    graph.addNeo4jEdge(new Neo4jEdge(relationship));
                }else {
                    log.error("目前不支持{}類型的查詢數(shù)據(jù)解析。", type.name());
                }
            }
        }
        return graph;
    }

    public void addNeo4jNode(Neo4jNode neo4jNode) {
        nodes.add(neo4jNode);
    }

    public void addNeo4jEdge(Neo4jEdge neo4jEdge) {
        edges.add(neo4jEdge);
    }

}

5.Neo4jNode

package com.win.chaos.model.neo4j;

import lombok.Data;
import org.neo4j.driver.types.Node;

import java.util.*;

@Data
public class Neo4jNode {

    private Object id;

    private List<String> labels = new ArrayList<>();

    private Map<String, Object> props = new HashMap<>();

    public Neo4jNode(Node node) {
        id = node.id();
        parseLabels(node);
        parseProp(node);
    }


    public void parseLabels(Node node){
        if (node.labels() != null){
            node.labels().forEach(labels::add);
        }
    }

    public void parseProp(Node node) {
        Map<String, Object> propsMap = node.asMap();
        Set<String> keys = propsMap.keySet();
        for (String key : keys){
            props.put(key, propsMap.get(key));
        }
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Neo4jNode vertex = (Neo4jNode) o;
        return id.equals(vertex.id);
    }

    @Override
    public int hashCode() {
        return id.hashCode();
    }
}

6.Neo4jEdge

package com.win.chaos.model.neo4j;

import lombok.Data;
import org.neo4j.driver.types.Relationship;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

@Data
public class Neo4jEdge {

    private long edgeId;

    private Object srcId;

    private Object dstId;

    private String label;

    private Map<String, Object> props = new HashMap<>();

    public Neo4jEdge(Relationship relationship) {
        srcId = relationship.startNodeId();
        dstId = relationship.endNodeId();
        edgeId = relationship.id();
        label = relationship.type();
        parseProps(relationship);
    }

    private void parseProps(Relationship relationship) {
        Map<String, Object> data = relationship.asMap();
        Set<String> keys = data.keySet();
        for (String key : keys) {
            props.put(key, data.get(key));
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Neo4jEdge that = (Neo4jEdge) o;
        //if (!edgeId.equals(that.edgeId)) return false;
        if (!srcId.equals(that.srcId)) return false;
        if (!dstId.equals(that.dstId)) return false;
        return label.equals(that.label);
    }

    @Override
    public int hashCode() {
        int result = srcId.hashCode();
        result = 31 * result + dstId.hashCode();
        result = 31 * result + label.hashCode();
        result = 31 * result + (int) (edgeId ^ (edgeId >>> 32));
        return result;
    }
}


完整代碼:springboot_neo4j_hanlp

參考

圖數(shù)據(jù)庫 Neo4j Java Api 的使用文章來源地址http://www.zghlxwxcb.cn/news/detail-660565.html

到了這里,關(guān)于springboot整合neo4j-使用原生cypher的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 圖數(shù)據(jù)庫_Neo4j和SpringBoot Data整合使用_實戰(zhàn)創(chuàng)建明星關(guān)系圖譜---Neo4j圖數(shù)據(jù)庫工作筆記0010

    2023-09-10 10:37:48 補充 注意:下面是舊版本的語法,如果你發(fā)現(xiàn)@NodeEntity這樣的注解沒有的話可以這樣: 這里就要用@Node 另外如果@StartNode和@EndNode都沒有了,那么說明是用法變了. 關(guān)于最新的用法,在官網(wǎng)有明確的說明和案例,很有用: 下面給出官網(wǎng)的案例:

    2024年02月09日
    瀏覽(49)
  • springboot整合neo4j模糊查詢

    1.場景 查詢與content相似的實體 解決方案: 1.直接從neo4j中查詢所有實體并使用杰卡德相似度算法計算相似度,返回top n,該方案由于要匹配圖中所有實體,性能較差。 2.模糊查詢neo4j中的實體,并對查詢結(jié)果與content做相似度計算,相似度算法為hutool中的TextSimilarity.similar()接口

    2024年02月13日
    瀏覽(24)
  • 圖數(shù)據(jù)庫_Neo4j和SpringBoot整合使用_創(chuàng)建節(jié)點_刪除節(jié)點_創(chuàng)建關(guān)系_使用CQL操作圖譜---Neo4j圖數(shù)據(jù)庫工作筆記0009

    圖數(shù)據(jù)庫_Neo4j和SpringBoot整合使用_創(chuàng)建節(jié)點_刪除節(jié)點_創(chuàng)建關(guān)系_使用CQL操作圖譜---Neo4j圖數(shù)據(jù)庫工作筆記0009

    首先需要引入依賴 ? springboot提供了一個spring data neo4j來操作 neo4j ? 可以看到它的架構(gòu) ? 這個是下載下來的jar包來看看 有很多cypher對吧 ? 可以看到就是通過封裝的驅(qū)動來操作graph database ? 然后開始弄一下 首先添加依賴

    2024年02月12日
    瀏覽(26)
  • Springboot整合Neo4J圖數(shù)據(jù)庫

    1.引入依賴 JDK11, neo4J4.4.23 2.解決springboot與neo4j兼容問題

    2024年02月09日
    瀏覽(28)
  • SpringBoot 整合 Neo4j、MySQL 多數(shù)據(jù)源方案(Druid Mybatis DynamicDatasource)

    本文總結(jié)了Neo4j和Spring/SpringBoot、Alibaba Druid、Dynamic Datasource、Mybatis等整合方案,對相應(yīng)配置做了詳細說明。 添加Neo4j JDBC Driver依賴 添加application.yml配置 添加Neo4j JDBC Driver + Alibaba Druid依賴 添加application.yml配置 添加Neo4j JDBC Driver、Alibaba Druid、Dynamic DataSource依賴 添加application.y

    2023年04月08日
    瀏覽(19)
  • 圖數(shù)據(jù)庫Neo4j——SpringBoot使用Neo4j & 簡單增刪改查 & 復(fù)雜查詢初步

    圖數(shù)據(jù)庫Neo4j——SpringBoot使用Neo4j & 簡單增刪改查 & 復(fù)雜查詢初步

    圖形數(shù)據(jù)庫是專門用于存儲圖形數(shù)據(jù)的數(shù)據(jù)庫,它使用圖形模型來存儲數(shù)據(jù),并且支持復(fù)雜的圖形查詢。常見的圖形數(shù)據(jù)庫有Neo4j、OrientDB等。 Neo4j是用Java實現(xiàn)的開源NoSQL圖數(shù)據(jù)庫,本篇博客介紹如何在SpringBoot中使用Neo4j圖數(shù)據(jù)庫,如何進行簡單的增刪改查,以及如何進行復(fù)雜

    2024年02月06日
    瀏覽(34)
  • Spring Boot整合neo4j

    Spring Boot整合neo4j

    相關(guān)版本信息 1、配置文件 Pom文件中引入依賴 Spring生態(tài)中Spring-data部分不僅僅提供了Spring-data-jpa , 也提供了Spring-data-neo4j 支持spring和 neo4j的完美融合,pom.xml 文件中依賴 yml文件中配置連接屬性 2、實體類(NodeEntity) @NodeEntity: 標明是一個節(jié)點實體@RelationshipEntity:標明是一個

    2024年02月10日
    瀏覽(19)
  • springboot+neo4j

    請通過依賴項管理包含啟動器模塊并配置要使用的 Bolt URL,例如 spring.neo4j.uri=bolt://localhost:7687 。啟動器假設(shè)服務(wù)器已禁用身份驗證。由于 SDN 啟動器依賴于 Java 驅(qū)動程序的啟動器,因此此處所說的有關(guān)配置的所有內(nèi)容也適用于此處。有關(guān)可用屬性的參考,請在 spring.neo4j 命名

    2024年01月20日
    瀏覽(28)
  • 【neo4j】neo4j的安裝與使用

    【neo4j】neo4j的安裝與使用

    https://www.oracle.com/java/technologies/downloads/ 按照步驟安裝即可 配置環(huán)境變量 在系統(tǒng)變量中添加 path變量中添加 https://neo4j.com/deployment-center/ 下載后,在指定位置解壓縮 與java相同,也需要設(shè)置環(huán)境變量。 終端輸入neo4j.bat console 成功

    2024年02月03日
    瀏覽(31)
  • 【Springboot集成Neo4j完整版教程】

    【Springboot集成Neo4j完整版教程】

    ?? Neo4j ?? ?? 算法刷題專欄 | 面試必備算法 | 面試高頻算法 ?? ?? 越難的東西,越要努力堅持,因為它具有很高的價值,算法就是這樣? ?? 作者簡介:碩風(fēng)和煒,CSDN-Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者??,保研|國家獎學(xué)金|高中學(xué)習(xí)JAVA|大學(xué)完善JAVA開發(fā)技術(shù)棧|面試刷題|面經(jīng)八股文|經(jīng)驗

    2024年02月10日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包