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

springboot整合neo4j-使用原生cypher Java API

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

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

1.背景

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

2.分析

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

3.代碼實(shí)戰(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不能被消費(fèi)
     * @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語(yǔ)句
     * @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é)點(diǎn)
    @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);
    }
    //測(cè)試創(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);
    }

以上代碼實(shí)現(xiàn)了springboot整合neo4j原生cypher,可以進(jìn)行業(yè)務(wù)數(shù)據(jù)對(duì)象無(wú)關(guān)的操作。
代碼中的Neo4jGraph.parse為解析查詢對(duì)象接口。如有需要請(qǐng)看下面代碼。
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é)點(diǎn)(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ù)庫(kù) Neo4j Java Api 的使用文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-702472.html

到了這里,關(guān)于springboot整合neo4j-使用原生cypher Java API的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • SpringBoot整合Neo4j

    Neo4j是一個(gè)高性能的,NOSQL圖形數(shù)據(jù)庫(kù),它的內(nèi)部就是一個(gè)高性能的圖形引擎,專門為應(yīng)用程序提供嵌入式,磁盤的高性能存儲(chǔ)和遍歷圖形結(jié)構(gòu)的能力。Spring Boot是一個(gè)旨在簡(jiǎn)化創(chuàng)建獨(dú)立的,生產(chǎn)級(jí)別的Spring基礎(chǔ)應(yīng)用程序的開發(fā)框架。在本文中,我們將探討如何在Spring Boot項(xiàng)目

    2024年02月06日
    瀏覽(22)
  • 圖數(shù)據(jù)庫(kù)_Neo4j和SpringBoot Data整合使用_實(shí)戰(zhàn)創(chuàng)建明星關(guān)系圖譜---Neo4j圖數(shù)據(jù)庫(kù)工作筆記0010

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

    2024年02月09日
    瀏覽(47)
  • neo4j教程-Cypher操作

    neo4j教程-Cypher操作

    Cypher是圖形存儲(chǔ)數(shù)據(jù)庫(kù)Neo4j的查詢語(yǔ)言,Cypher是通過(guò)模式匹配Neo4j數(shù)據(jù)庫(kù)中的節(jié)點(diǎn)和關(guān)系,從而對(duì)數(shù)據(jù)庫(kù)Neo4j中的節(jié)點(diǎn)和關(guān)系進(jìn)行一系列的相關(guān)操作。 下面,通過(guò)一張表來(lái)介紹一下常用的Neo4j操作命令及相關(guān)說(shuō)明,具體如表所示。 操作命令 相關(guān)說(shuō)明 CREATE 創(chuàng)建節(jié)點(diǎn)、關(guān)系 MATC

    2024年02月15日
    瀏覽(20)
  • Neo4j 與 Cypher 基礎(chǔ)

    Neo4j 與 Cypher 基礎(chǔ)

    更好的閱讀體驗(yàn) huge{color{red}{更好的閱讀體驗(yàn)}} 更好的閱讀體驗(yàn) Neo4j 是用 Java 實(shí)現(xiàn)的開源 NoSQL 圖數(shù)據(jù)庫(kù)。從2003年開始開發(fā),2007年正式發(fā)布第一版,其源碼托管于 GitHub。 與常見的關(guān)系型數(shù)據(jù)庫(kù)不同, Neo4j 基于圖圖結(jié)構(gòu)來(lái)表示和存儲(chǔ)數(shù)據(jù),并提供了申明式的查詢語(yǔ)言 Cypher

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

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

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

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

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

    2024年02月12日
    瀏覽(26)
  • neo4j查詢語(yǔ)言Cypher詳解(三)--函數(shù)

    Cypher中的函數(shù)如果輸入?yún)?shù)為null,則返回null。 以字符串作為輸入的函數(shù)都對(duì)Unicode字符進(jìn)行操作,而不是對(duì)標(biāo)準(zhǔn)字符進(jìn)行操作。例如,size()函數(shù)應(yīng)用于任何Unicode字符將返回1,即使該字符不適合一個(gè)字符的16位。 可以通過(guò) SHOW FUNCTIONS 查看函數(shù)定義。 函數(shù)簽名中參數(shù)格式:e

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

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

    2024年02月09日
    瀏覽(27)
  • 圖數(shù)據(jù)庫(kù)Neo4j——Neo4j簡(jiǎn)介、數(shù)據(jù)結(jié)構(gòu) & Docker版本的部署安裝 & Cypher語(yǔ)句的入門

    圖數(shù)據(jù)庫(kù)Neo4j——Neo4j簡(jiǎn)介、數(shù)據(jù)結(jié)構(gòu) & Docker版本的部署安裝 & Cypher語(yǔ)句的入門

    MySQL是一種開源的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),使用SQL作為其查詢語(yǔ)言,常見的關(guān)系型數(shù)據(jù)庫(kù)有MySQL、Oracle、SQL Server、PostgreSQL等。相關(guān)博客文章如下: 【合集】MySQL的入門進(jìn)階強(qiáng)化——從 普通人 到 超級(jí)賽亞人 的 華麗轉(zhuǎn)身 PostgreSQL數(shù)據(jù)庫(kù)——Docker版本的postgres安裝 Navicat連接方式

    2024年02月06日
    瀏覽(51)
  • neo4j查詢語(yǔ)言Cypher詳解(一)--語(yǔ)法和子句

    neo4j 的圖查詢語(yǔ)言叫 Cypher 。Cypher的獨(dú)特之處在于它提供了一種匹配模式和關(guān)系的可視化方式。 (nodes)-[:ARE_CONNECTED_TO]-(otherNodes) 使用圓角括號(hào)表示節(jié)點(diǎn)(nodes), -[:ARROWS]- 表示關(guān)系。 Cypher解析器接受任意輸入字符串。 unicode 通??梢允褂棉D(zhuǎn)義 uxxx 。 支持的空白符 描述 Unicode 字

    2024年02月14日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包