溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么用Java客戶端將數(shù)據(jù)加載到Grakn知識(shí)圖中

發(fā)布時(shí)間:2021-09-17 09:22:21 來(lái)源:億速云 閱讀:152 作者:chen 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“怎么用Java客戶端將數(shù)據(jù)加載到Grakn知識(shí)圖中”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

將數(shù)據(jù)遷移到Grakn

我們將概述遷移的發(fā)生方式。

  1. 首先,我們需要與我們的Grakn鍵空間進(jìn)行對(duì)話。為此,我們將使用Grakn的Java客戶端。

  2. 我們將遍歷每個(gè)數(shù)據(jù)文件,提取每個(gè)數(shù)據(jù)項(xiàng)并將其解析為JSON對(duì)象。

  3. 我們將每個(gè)數(shù)據(jù)項(xiàng)(以JSON對(duì)象的形式)傳遞給其對(duì)應(yīng)的模板。模板返回的是用于將該項(xiàng)插入Grakn的Graql查詢。

  4. 我們將執(zhí)行每個(gè)查詢以將數(shù)據(jù)加載到目標(biāo)鍵空間 - phone_calls。

在繼續(xù)之前,請(qǐng)確保已安裝Java 1.8并在計(jì)算機(jī)上運(yùn)行Grakn服務(wù)器。

入門

創(chuàng)建一個(gè)新的Maven項(xiàng)目

該項(xiàng)目使用SDK 1.8并命名phone_calls。我將使用IntelliJ作為IDE。

將Grakn設(shè)置為依賴關(guān)系

修改pom.xml以包含最新版本的Grakn(1.4.2)作為依賴項(xiàng)。

<?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 > ai.grakn.examples </ groupId >
    < artifactId > migrate-csv-to-grakn </ artifactId >
    < version > 1.0-SNAPSHOT </ version >

    < 存儲(chǔ)庫(kù)>
        < repository >
            < id >發(fā)布</ id >
            < url > https://oss.sonatype.org/content/repositories/releases </ url >
        </ repository >
    </ repositories >

    < properties >
        < grakn.version > 1.4.2 </ grakn.version >
        < maven.compiler.source > 1.7 </ maven.compiler.source >
        < maven.compiler.target > 1.7 </ maven.compiler.target >
    </ properties >

    < dependencies >
        < 依賴>
            < groupId > ai.grakn </ groupId >
            < artifactId > client-java </ artifactId >
            < version > $ {grakn.version} </ version >
        </ dependency >
    </ dependencies >
</ project >

配置日志記錄

我們希望能夠配置Grakn注銷的內(nèi)容。為此,請(qǐng)修改pom.xml以排除slf4j附帶graknlogback作為依賴項(xiàng)添加。


<?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 >

    <! -  ...  - >

    < dependencies >
        < 依賴>
            < groupId > ai.grakn </ groupId >
            < artifactId > client-java </ artifactId >
            < version > $ {grakn.version} </ version >
            < exclusions >
                < 排除>
                    < groupId > org.slf4j </ groupId >
                    < artifactId > slf4j-simple </ artifactId >
                </ exclusion >
            </ exclusions >
        </ dependency >
        < 依賴>
            < groupId > ch.qos.logback </ groupId >
            < artifactId > logback-classic </ artifactId >
            < version > 1.2.3 </ version >
        </ dependency >
    </ dependencies >
</ project >

接下來(lái),添加一個(gè)logback.xml 使用以下內(nèi)容調(diào)用的新文件并將其放在下面src/main/resources。

< configuration  debug = “false” >
    < root  level = “INFO” />
</ configuration >

創(chuàng)建遷移類

src/main創(chuàng)建一個(gè)名為的新文件Migration.java。這是我們要編寫(xiě)所有代碼的地方。

包括數(shù)據(jù)文件

選擇以下數(shù)據(jù)格式之一并下載文件。下載四個(gè)文件中的每個(gè)文件后,將它們放在src/main/resources/data目錄下。我們將使用它們將數(shù)據(jù)加載到我們的phone_calls知識(shí)圖中。

隨后的所有代碼都將被寫(xiě)入Migration.java

指定每個(gè)數(shù)據(jù)文件的詳細(xì)信息

在此之前,我們需要一個(gè)結(jié)構(gòu)來(lái)包含讀取數(shù)據(jù)文件和構(gòu)建Graql查詢所需的詳細(xì)信息。這些細(xì)節(jié)包括:

  • 數(shù)據(jù)文件的路徑,和

  • 接收J(rèn)SON對(duì)象并生成Graql插入查詢的模板函數(shù)。

為此,我們創(chuàng)建了一個(gè)名為的新子類Input。

導(dǎo)入 mjson。杰森 ;

公共 類 遷移 {
    abstract  static  class  Input {
        字符串 路徑 ;
        public  Input(String  path){
            這個(gè)。path  =  path ;
        }
        String  getDataPath(){ return  path ;}
        abstract  String  template(Json  數(shù)據(jù));
    }
}

在本文的后面,我們將看到如何Input創(chuàng)建類的實(shí)例,但在我們開(kāi)始之前,讓我們將mjson依賴項(xiàng)添加到文件中的dependencies標(biāo)記中pom.xml。

< 依賴>
    < groupId > org.sharegov </ groupId >
    < artifactId > mjson </ artifactId >
    < version > 1.4.0 </ version >
</ dependency >

是時(shí)候初始化了inputs。

下面的代碼調(diào)用initialiseInputs()返回集合的方法inputs。然后,我們將使用input此集合中的每個(gè)元素將每個(gè)數(shù)據(jù)文件加載到Grakn中。


//其他進(jìn)口
導(dǎo)入 java。util。ArrayList ;
導(dǎo)入 java。util。收藏 ;

公共 類 遷移 {
    抽象 靜態(tài) 類 輸入 {...}

    public  static  void  main(String [] args){
        集合< Input >  inputs  =  initialiseInputs();
    }

    static  Collection < Input >  initialiseInputs(){
        集合< Input >  inputs  =  new  ArrayList <>();
        // 接下來(lái)的是
        回報(bào) 輸入 ;
    }
}

公司的輸入實(shí)例


//進(jìn)口

公共 類 遷移 {
    抽象 靜態(tài) 類 輸入 {...}
    public  static  void  main(String [] args){...}

    static  Collection < Input >  initialiseInputs(){
        集合< Input >  inputs  =  new  ArrayList <>();

        輸入。add(new  Input(“data / companies”){
            @覆蓋
            public  String  template(Json  company){
                返回 “插入$ company isa company has name”  +  公司。at(“name”)+  “;” ;
            }
        });

        回報(bào) 輸入 ;
    }
}

input.getDataPath()會(huì)回來(lái)的data/companies

鑒于company

{ name:“Telecom” }

input.template(company) 將返回

插入 $公司 ISA  公司 擁有 的名稱 “電信” ;

一個(gè)人的輸入實(shí)例

//進(jìn)口

公共 類 遷移 {
    抽象 靜態(tài) 類 輸入 {...}
    public  static  void  main(String [] args){...}

    static  Collection < Input >  initialiseInputs(){
        集合< Input >  inputs  =  new  ArrayList <>();

        輸入。add(new  Input(“data / companies”){...});

        輸入。add(new  Input(“data / people”){
            @覆蓋
            public  String  template(Json  person){
                //插入人
                String  graqlInsertQuery  =  “insert $ person isa person has phone-number”  +  person。at(“phone_number”);

                如果(! 人。有(“FIRST_NAME” )){
                    //人不是客戶
                    graqlInsertQuery  + =  “has is-customer false” ;
                } else {
                    //人是顧客
                    graqlInsertQuery  + =  “has is-customer true” ;
                    graqlInsertQuery  + =  “有名字”  +  人。at(“first_name”);
                    graqlInsertQuery  + =  “有姓氏”  +  人。at(“l(fā)ast_name”);
                    graqlInsertQuery  + =  “有城市”  +  人。在(“城市”);
                    graqlInsertQuery  + =  “有年齡”  +  人。在(“年齡”)。asInteger();
                }

                graqlInsertQuery  + =  “;” ;
                return  graqlInsertQuery ;
            }
        });

        回報(bào) 輸入 ;
    }
}

input.getDataPath()會(huì)回來(lái)的data/people

鑒于person

{ phone_number:“+ 44 091 xxx” }

input.template(person) 將返回

插入 $人 擁有 電話- 數(shù)字 “+44 091 XXX” ;

并給予person

{ 冷杉- 名稱:“成龍”,最后- 名:“喬”,城市:“即墨”,年齡:77,PHONE_NUMBER:“+00 091 XXX” }

input.template(person) 將返回

插入 $人 擁有 電話- 數(shù)字 “+44 091 XXX”  具有 第一- 名字 “成龍”  已經(jīng) 過(guò)去- 名字 “喬”  有 城 “即墨”  具有 年齡 77 ;

合同的輸入實(shí)例

//進(jìn)口

公共 類 遷移 {
    抽象 靜態(tài) 類 輸入 {...}
    public  static  void  main(String [] args){...}

    static  Collection < Input >  initialiseInputs(){
        集合< Input >  inputs  =  new  ArrayList <>();

        輸入。add(new  Input(“data / companies”){...});

        輸入。add(new  Input(“data / people”){...});

        輸入。add(new  Input(“data / contracts”){
            @覆蓋
            public  String  template(Json  contract){
                //匹配公司
                String  graqlInsertQuery  =  “匹配$ company isa company has name”  +  contract。at(“company_name”)+  “;” ;
                //匹配人
                graqlInsertQuery  + =  “$ customer isa person has phone-number”  +  contract。at(“person_id”)+  “;” ;
                //插入合同
                graqlInsertQuery  + =  “insert(provider:$ company,customer:$ customer)isa contract;” ;
                return  graqlInsertQuery ;
            }
        });

        回報(bào) 輸入 ;
    }
}

input.getDataPath()會(huì)回來(lái)的data/contracts

鑒于contract

{ company_name:“Telecom”,person_id:“ + 00 091 xxx” }

input.template(contract) 將返回

比賽 $公司 ISA  公司 擁有 的名稱 “電信” ; $客戶 ISA  人 擁有 電話- 數(shù)字 “+00 091 XXX” ; insert(provider:$ company,customer:$ customer)isa  contract ;

呼叫的輸入實(shí)例

//進(jìn)口

公共 類 遷移 {
    抽象 靜態(tài) 類 輸入 {...}
    public  static  void  main(String [] args){...}

    static  Collection < Input >  initialiseInputs(){
        集合< Input >  inputs  =  new  ArrayList <>();

        輸入。add(new  Input(“data / companies”){...});

        輸入。add(new  Input(“data / people”){...});

        輸入。add(new  Input(“data / contracts”){...});

        輸入。add(new  Input(“data / calls”){
            @覆蓋
            public  String  template(Json  call){
                //匹配來(lái)電者
                String  graqlInsertQuery  =  “match $ caller isa person has phone-number”  +  call。at(“caller_id”)+  “;” ;
                //匹配被叫者
                graqlInsertQuery  + =  “$ callee isa person has phone-number”  +  call。at(“callee_id”)+  “;” ;
                //插入電話
                graqlInsertQuery  + =  “insert $ call(caller:$ caller,callee:$ callee)isa call;”  +
                        “$ call已經(jīng)開(kāi)始”  +  來(lái)電。at(“started_at”)。asString()+  “;”  +
                        “$ call has duration”  +  call。在(“持續(xù)時(shí)間”)。asInteger()+  “;” ;
                return  graqlInsertQuery ;
            }
        });

        回報(bào) 輸入 ;
    }
}

input.getDataPath()會(huì)回來(lái)的data/calls。

鑒于call

{ caller_id:“44 091 XXX” ,callee_id:“00 091 XXX” ,started_at:2018 - 08 - 10 T07:57:51,持續(xù)時(shí)間:148 }

input.template(call) 將返回

比賽 $呼叫者 ISA  人 擁有 電話- 數(shù)字 “+44 091 XXX” ; $被叫 ISA  人 擁有 電話- 數(shù)字 “+00 091 XXX” ; insert  $ call(caller:$ caller,callee:$ callee)isa  call ; $電話 已經(jīng) 開(kāi)始- 在 2018 - 08 - 10 T07:57:51 ; $電話 具有 持續(xù)時(shí)間 148 ;

連接和遷移

現(xiàn)在我們已經(jīng)為每個(gè)數(shù)據(jù)文件定義了數(shù)據(jù)路徑和模板,我們可以繼續(xù)連接我們的phone_calls知識(shí)圖并將數(shù)據(jù)加載到其中。

//其他進(jìn)口
進(jìn)口 ai。grakn。GraknTxType ;
進(jìn)口 ai。grakn。Keyspace ;
進(jìn)口 ai。grakn。客戶。Grakn ;
進(jìn)口 ai。grakn。util。SimpleURI ;
導(dǎo)入 java。io。UnsupportedEncodingException ;

公共 類 遷移 {
    抽象 靜態(tài) 類 輸入 {...}

    public  static  void  main(String [] args){
        集合< Input >  inputs  =  initialiseInputs();
        connectAndMigrate(輸入);
    }

    static  void  connectAndMigrate(Collection < Input >  inputs){
        SimpleURI  localGrakn  =  new  SimpleURI(“l(fā)ocalhost”,48555);
        Keyspace  keyspace  =  Keyspace。of(“phone_calls”);
        Grakn  grakn  =  new  Grakn(localGrakn);
        Grakn。會(huì)話 會(huì)話 =  grakn。session(keyspace);

        輸入。forEach(輸入 - > {
            系統(tǒng)。出。的println(“[由加載”  +  輸入。getDataPath()+  “]成Grakn ...”);
            嘗試 {
                loadDataIntoGrakn(輸入,會(huì)話);
            } catch(UnsupportedEncodingException  e){
                e。printStackTrace();
            }
        });

        會(huì)議。close();
    }

    static  Collection < Input >  initialiseInputs(){...}

    static  void  loadDataIntoGrakn(輸入 輸入,Grakn。會(huì)話 會(huì)話)拋出 UnsupportedEncodingException {...}
}

connectAndMigrate(Collection<Input> inputs)是啟動(dòng)數(shù)據(jù)遷移到phone_calls知識(shí)圖中的唯一方法。

此方法發(fā)生以下情況:

  1. grakn創(chuàng)建Grakn實(shí)例,連接到我們?cè)诒镜剡\(yùn)行的服務(wù)器localhost:48555。

  2. session創(chuàng)建A ,連接到鍵空間phone_calls。

  3. 對(duì)于集合中的每個(gè)input對(duì)象inputs,我們稱之為loadDataIntoGrakn(input, session)。這將負(fù)責(zé)將input對(duì)象中指定的數(shù)據(jù)加載到我們的鍵空間中。

  4. 最后session關(guān)閉了。

將數(shù)據(jù)加載到phone_calls

現(xiàn)在我們已經(jīng)session連接到phone_calls鍵空間,我們可以繼續(xù)將數(shù)據(jù)實(shí)際加載到我們的知識(shí)圖中。

//進(jìn)口

公共 類 遷移 {
    抽象 靜態(tài) 類 輸入 {...}

    public  static  void  main(String [] args){
        集合< Input >  inputs  =  initialiseInputs();
        connectAndMigrate(輸入);
    }

    static  Collection < Input >  initialiseInputs(){...}

    static  void  connectAndMigrate(Collection < Input >  inputs){...}

    static  void  loadDataIntoGrakn(輸入 輸入,Grakn。會(huì)話 會(huì)話)拋出 UnsupportedEncodingException {
        ArrayList < Json >  items  =  parseDataToJson(輸入);
        物品。forEach(item  - > {
            Grakn。交易 tx  =  會(huì)話。交易(GraknTxType。WRITE);
            String  graqlInsertQuery  =  input。模板(項(xiàng)目);
            系統(tǒng)。出。println(“執(zhí)行Graql查詢:”  +  graqlInsertQuery);
            tx。graql()。解析(graqlInsertQuery)。execute();
            tx。commit();
            tx。close();
        });
        系統(tǒng)。出。的println(“\ nInserted”  +  項(xiàng)目。大?。ǎ?  “由項(xiàng)目[”  +  輸入。getDataPath()+  “]。到Grakn \ n”個(gè));
    }

    static  ArrayList < Json >  parseDataToJson(輸入 輸入)拋出 UnsupportedEncodingException {...}
}

為了將每個(gè)文件中的數(shù)據(jù)加載到Grakn中,我們需要:

  1. 檢索一個(gè)ArrayListJSON對(duì)象,每個(gè)對(duì)象代表一個(gè)數(shù)據(jù)項(xiàng)。為此,我們呼吁parseDataToJson(input),和

  2. 對(duì)于每個(gè)JSON對(duì)象items:a)創(chuàng)建事務(wù)tx,b)構(gòu)造graqlInsertQuery使用相應(yīng)的template,c)運(yùn)行query,d)commit事務(wù)和e)close事務(wù)。

有關(guān)創(chuàng)建和提交事務(wù)的注意事項(xiàng):為避免內(nèi)存不足,建議在單個(gè)事務(wù)中創(chuàng)建和提交每個(gè)查詢。但是,為了更快地遷移大型數(shù)據(jù)集,每次查詢都會(huì)發(fā)生一次,其中是保證在單個(gè)事務(wù)上運(yùn)行的最大查詢數(shù)。

現(xiàn)在我們已經(jīng)完成了上述所有操作,我們已準(zhǔn)備好讀取每個(gè)文件并將每個(gè)數(shù)據(jù)項(xiàng)解析為JSON對(duì)象。這些JSON對(duì)象將被傳遞給template每個(gè)Input對(duì)象上的方法。

我們要編寫(xiě)實(shí)現(xiàn)parseDataToJson(input)。

DataFormat特定實(shí)現(xiàn)

parseDataToJson(input)根據(jù)數(shù)據(jù)文件的格式,實(shí)現(xiàn)會(huì)有所不同。

但無(wú)論數(shù)據(jù)格式是什么,我們都需要正確的設(shè)置來(lái)逐行讀取文件。為此,我們將使用InputStreamReader。

//其他進(jìn)口
導(dǎo)入 java。io。InputStreamReader ;
導(dǎo)入 java。io。讀者 ;


公共 類 遷移 {
    抽象 靜態(tài) 類 輸入 {...}

    public  static  void  main(String [] args){...}

    static  void  connectAndMigrate(Collection < Input >  inputs){...}

    static  Collection < Input >  initialiseInputs(){...}

    static  void  loadDataIntoGrakn(輸入 輸入,Grakn。會(huì)話 會(huì)話)拋出 UnsupportedEncodingException {...}

    public  static  Reader  getReader(String  relativePath)throws  UnsupportedEncodingException {
        返回 新 的InputStreamReader(遷移。類。getClassLoader()。的getResourceAsStream(relativePath),“UTF-8”);
    }
}

解析CSV

我們將使用Univocity CSV Parser來(lái)解析我們的.csv文件。讓我們?yōu)樗砑右蕾図?xiàng)。我們需要在dependencies標(biāo)簽中添加以下內(nèi)容pom.xml。

< 依賴>
    < groupId > com.univocity </ groupId >
    < artifactId > univocity-parsers </ artifactId >
    < version > 2.7.6 </ version >
</ dependency >

完成后,我們將編寫(xiě)parseDataToJson(input)解析.csv文件的實(shí)現(xiàn)。

//其他進(jìn)口

進(jìn)口 com。不公平。解析器。csv。CsvParser ;
進(jìn)口 com。不公平。解析器。csv。CsvParserSettings ;

公共 類 遷移 {
    抽象 靜態(tài) 類 輸入 {...}

    public  static  void  main(String [] args){...}

    static  void  connectAndMigrate(Collection < Input >  inputs){...}

    static  Collection < Input >  initialiseInputs(){...}

    static  void  loadDataIntoGrakn(輸入 輸入,Grakn。會(huì)話 會(huì)話)拋出 UnsupportedEncodingException {...}

    static  ArrayList < Json >  parseDataToJson(輸入 輸入)拋出 UnsupportedEncodingException {
        ArrayList < Json >  items  =  new  ArrayList <>();

        CsvParserSettings  settings  =  new  CsvParserSettings();
        設(shè)置。setLineSeparatorDetectionEnabled(true);
        CsvParser  解析器 =  新的 CsvParser(設(shè)置);
        解析器。beginParsing(getReader(輸入。getDataPath()+  “的.csv” ));

        String [] columns  =  parser。parseNext();
        String [] row ;
        而((行 =  分析器。parseNext())!=  空){
            Json  item  =  Json。object();
            對(duì)于(詮釋 我 =  0 ; 我 <  行。長(zhǎng)度 ; 我++){
                項(xiàng)目。set(columns [ i ],row [ i ]);
            }
            物品。add(item);
        }
        返回 的項(xiàng)目 ;
    }

    public  static  Reader  getReader(String  relativePath)throws  UnsupportedEncodingException {
        返回 新 的InputStreamReader(遷移。類。getClassLoader()。的getResourceAsStream(relativePath),“UTF-8”);
    }
}

除了這個(gè)實(shí)現(xiàn),我們還需要進(jìn)行一次更改。

鑒于CSV文件的性質(zhì),生成的JSON對(duì)象將把.csv文件的所有列作為其鍵,即使該值不存在,它也將被視為一個(gè)null。

出于這個(gè)原因,我們需要在persontemplateinput實(shí)例方法中更改一行。

if (! person.has("first_name")) {...}

if (person.at("first_name").isNull()) {...}

閱讀JSON

我們將使用Gson的JsonReader來(lái)讀取我們的.json文件。讓我們?yōu)樗砑右蕾図?xiàng)。我們需要在dependencies標(biāo)簽中添加以下內(nèi)容pom.xml。

< 依賴>
    < groupId > com.google.code.gson </ groupId >
    < artifactId > gson </ artifactId >
    < version > 2.7 </ version >
</ dependency >

完成后,我們將編寫(xiě)parseDataToJson(input)用于讀取.json文件的實(shí)現(xiàn)。

//其他進(jìn)口
進(jìn)口 com。谷歌。gson。流。JsonReader ;

公共 類 遷移 {
    抽象 靜態(tài) 類 輸入 {...}

    public  static  void  main(String [] args){...}

    static  void  connectAndMigrate(Collection < Input >  inputs){...}

    static  Collection < Input >  initialiseInputs(){...}

    static  void  loadDataIntoGrakn(輸入 輸入,Grakn。會(huì)話 會(huì)話)拋出 UnsupportedEncodingException {...}

    static  ArrayList < Json >  parseDataToJson(輸入 輸入)拋出 IOException {
        ArrayList < Json >  items  =  new  ArrayList <>();

        JsonReader  jsonReader  =  新 JsonReader(getReader(輸入。getDataPath()+  “上傳.json” ));

        jsonReader。beginArray();
        而(jsonReader。hasNext()){
            jsonReader。beginObject();
            Json  item  =  Json。object();
            而(jsonReader。hasNext()){
                String  key  =  jsonReader。nextName();
                開(kāi)關(guān)(jsonReader。PEEK()){
                    案例 STRING:
                        項(xiàng)目。集(鍵,jsonReader。nextString());
                        打破 ;
                    案件 編號(hào):
                        項(xiàng)目。集(鍵,jsonReader。nextInt());
                        打破 ;
                }
            }
            jsonReader。endObject();
            物品。add(item);
        }
        jsonReader。endArray();
        返回 的項(xiàng)目 ;
    }

    public  static  Reader  getReader(String  relativePath)throws  UnsupportedEncodingException {
        返回 新 的InputStreamReader(遷移。類。getClassLoader()。的getResourceAsStream(relativePath),“UTF-8”);
    }
}

解析XML

我們將使用Java的內(nèi)置StAX來(lái)解析我們的.xml文件。

要解析XML數(shù)據(jù),我們需要知道目標(biāo)標(biāo)記的名稱。這需要在Input類中聲明并在構(gòu)造每個(gè)input對(duì)象時(shí)指定。

//進(jìn)口

公共 類 XmlMigration {
    abstract  static  class  Input {
        字符串 路徑 ;
        串 選擇 ;
        public  Input(String  path,String  selector){
            這個(gè)。path  =  path ;
            這個(gè)。selector  =  selector ;
        }
        String  getDataPath(){ return  path ;}
        String  getSelector(){ return  selector ;}
        abstract  String  template(Json  數(shù)據(jù));
    }

    public  static  void  main(String [] args){...}

    static  void  connectAndMigrate(Collection < Input >  inputs){...}

    static  Collection < Input >  initialiseInputs(){
        集合< Input >  inputs  =  new  ArrayList <>();

        輸入。add(new  Input(“data / companies”,“company”){...});
        輸入。添加(新 輸入(“數(shù)據(jù)/人”,“人”){...});
        輸入。add(new  Input(“data / contracts”,“contract”){...});
        輸入。add(new  Input(“data / calls”,“call”){...});

        回報(bào) 輸入 ;
    }

    static  void  loadDataIntoGrakn(輸入 輸入,Grakn。會(huì)話 會(huì)話)拋出 UnsupportedEncodingException,XMLStreamException {...}

    public  static  Reader  getReader(String  relativePath)throws  UnsupportedEncodingException {...}
}

現(xiàn)在用于parseDataToJson(input)解析.xml文件的實(shí)現(xiàn)。

//其他進(jìn)口
導(dǎo)入 javax。xml。流。XMLInputFactory ;
導(dǎo)入 javax。xml。流。XMLStreamConstants ;
導(dǎo)入 javax。xml。流。XMLStreamException ;
導(dǎo)入 javax。xml。流。XMLStreamReader ;

公共 類 XmlMigration {
    abstract  static  class  Input {
        字符串 路徑 ;
        串 選擇 ;
        public  Input(String  path,String  selector){
            這個(gè)。path  =  path ;
            這個(gè)。selector  =  selector ;
        }
        String  getDataPath(){ return  path ;}
        String  getSelector(){ return  selector ;}
        abstract  String  template(Json  數(shù)據(jù));
    }

    public  static  void  main(String [] args){...}

    static  void  connectAndMigrate(Collection < Input >  inputs){...}

    static  Collection < Input >  initialiseInputs(){
        集合< Input >  inputs  =  new  ArrayList <>();

        輸入。add(new  Input(“data / companies”,“company”){...});
        輸入。添加(新 輸入(“數(shù)據(jù)/人”,“人”){...});
        輸入。add(new  Input(“data / contracts”,“contract”){...});
        輸入。add(new  Input(“data / calls”,“call”){...});

        回報(bào) 輸入 ;
    }

    static  void  loadDataIntoGrakn(輸入 輸入,Grakn。會(huì)話 會(huì)話)拋出 UnsupportedEncodingException,XMLStreamException {...}

    static  ArrayList < Json >  parseDataToJson(輸入 輸入)拋出 UnsupportedEncodingException,XMLStreamException {
        ArrayList < Json >  items  =  new  ArrayList <>();

        XMLStreamReader  r  =  XMLInputFactory。newInstance()。createXMLStreamReader(getReader(輸入。getDataPath()+  “的.xml” ));
        字符串 鍵 ;
        String  value  =  null ;
        Boolean  inSelector  =  false ;
        Json  item  =  null ;
        而([R 。hasNext()){
            int  event  =  r。next();

            開(kāi)關(guān)(事件){
                case  XMLStreamConstants。START_ELEMENT:
                    如果(?。號(hào)·getLocalName()。等于(輸入。getSelector())){
                        inSelector  =  true ;
                        item  =  Json。object();
                    }
                    打破 ;

                case  XMLStreamConstants。字符:
                    value  =  r。getText();
                    打破 ;

                case  XMLStreamConstants。END_ELEMENT:
                    key  =  r。getLocalName();
                    如果(inSelector  &&  ! 關(guān)鍵。平等(輸入。getSelector())){
                        項(xiàng)目。set(key,value);
                    }
                    如果(鍵。等于(輸入。getSelector())){
                        inSelector  =  false ;
                        物品。add(item);
                    }

                    打破 ;
            }
        }
        返回 的項(xiàng)目 ;
    }

    public  static  Reader  getReader(String  relativePath)throws  UnsupportedEncodingException {...}
}

把它放在一起

以下是我們Migrate.java將CSV數(shù)據(jù)加載到Grakn中的樣子,并在這里找到JSON和XML文件的樣子。

包 ai。grakn。例子 ;

進(jìn)口 ai。grakn。GraknTxType ;
進(jìn)口 ai。grakn。Keyspace ;
進(jìn)口 ai。grakn??蛻簟rakn ;
進(jìn)口 ai。grakn。util。SimpleURI ;

/ **
 *用于CSV,TSV和固定寬度文件的快速可靠的基于Java的解析器的集合
 * @see <a href="https://www.univocity.com/pages/univocity_parsers_documentation"> univocity </a>
 * /
進(jìn)口 com。不公平。解析器。csv。CsvParser ;
進(jìn)口 com。不公平。解析器。csv。CsvParserSettings ;

/ **
 *適用于Java的精簡(jiǎn)JSON庫(kù),
 * @see <a href="https://bolerio.github.io/mjson/"> mjson </a>
 * /
導(dǎo)入 mjson。杰森 ;

導(dǎo)入 java。io。InputStreamReader ;
導(dǎo)入 java。io。讀者 ;
導(dǎo)入 java。io。UnsupportedEncodingException ;
導(dǎo)入 java。util。ArrayList ;
導(dǎo)入 java。util。收藏 ;

公共 課 CsvMigration {
    / **
     *表示將輸入文件鏈接到自己的模板函數(shù)的Input對(duì)象,
     *用于將Json對(duì)象映射到Graql查詢字符串
     * /
    abstract  static  class  Input {
        字符串 路徑 ;

        public  Input(String  path){
            這個(gè)。path  =  path ;
        }

        String  getDataPath(){ return  path ;}

        abstract  String  template(Json  數(shù)據(jù));
    }

    / **
     * 1.創(chuàng)建Grakn實(shí)例
     * 2.創(chuàng)建到目標(biāo)鍵空間的會(huì)話
     * 3.初始化輸入列表,每個(gè)輸入包含解析數(shù)據(jù)所需的詳細(xì)信息
     * 4.將csv數(shù)據(jù)加載到每個(gè)文件的Grakn
     * 5.結(jié)束會(huì)議
     * /
    public  static  void  main(String [] args){
        集合< Input >  inputs  =  initialiseInputs();
        connectAndMigrate(輸入);
    }

    static  void  connectAndMigrate(Collection < Input >  inputs){
        SimpleURI  localGrakn  =  new  SimpleURI(“l(fā)ocalhost”,48555);
        Grakn  grakn  =  new  Grakn(localGrakn);
        Keyspace  keyspace  =  Keyspace。of(“phone_calls”);
        Grakn。會(huì)話 會(huì)話 =  grakn。session(keyspace);

        輸入。forEach(輸入 - > {
            系統(tǒng)。出。的println(“[由加載”  +  輸入。getDataPath()+  “]成Grakn ...”);
            嘗試 {
                loadDataIntoGrakn(輸入,會(huì)話);
            } catch(UnsupportedEncodingException  e){
                e。printStackTrace();
            }
        });

        會(huì)議。close();
    }

    static  Collection < Input >  initialiseInputs(){
        集合< Input >  inputs  =  new  ArrayList <>();

        //定義用于構(gòu)建公司Graql插入查詢的模板
        輸入。add(new  Input(“data / companies”){
            @覆蓋
            public  String  template(Json  company){
                返回 “插入$ company isa company has name”  +  公司。at(“name”)+  “;” ;
            }
        });
        //定義用于構(gòu)造人Graql插入查詢的模板
        輸入。add(new  Input(“data / people”){
            @覆蓋
            public  String  template(Json  person){
                //插入人
                String  graqlInsertQuery  =  “insert $ person isa person has phone-number”  +  person。at(“phone_number”);

                如果(個(gè)人。在(“FIRST_NAME” )。參考isNull()){
                    //人不是客戶
                    graqlInsertQuery  + =  “has is-customer false” ;
                } else {
                    //人是顧客
                    graqlInsertQuery  + =  “has is-customer true” ;
                    graqlInsertQuery  + =  “有名字”  +  人。at(“first_name”);
                    graqlInsertQuery  + =  “有姓氏”  +  人。at(“l(fā)ast_name”);
                    graqlInsertQuery  + =  “有城市”  +  人。在(“城市”);
                    graqlInsertQuery  + =  “有年齡”  +  人。在(“年齡”)。asInteger();
                }

                graqlInsertQuery  + =  “;” ;
                return  graqlInsertQuery ;
            }
        });
        //定義用于構(gòu)造合同的模板Graql插入查詢
        輸入。add(new  Input(“data / contracts”){
            @覆蓋
            public  String  template(Json  contract){
                //匹配公司
                String  graqlInsertQuery  =  “匹配$ company isa company has name”  +  contract。at(“company_name”)+  “;” ;
                //匹配人
                graqlInsertQuery  + =  “$ customer isa person has phone-number”  +  contract。at(“person_id”)+  “;” ;
                //插入合同
                graqlInsertQuery  + =  “insert(provider:$ company,customer:$ customer)isa contract;” ;
                return  graqlInsertQuery ;
            }
        });
        //定義用于構(gòu)造調(diào)用Graql插入查詢的模板
        輸入。add(new  Input(“data / calls”){
            @覆蓋
            public  String  template(Json  call){
                //匹配來(lái)電者
                String  graqlInsertQuery  =  “match $ caller isa person has phone-number”  +  call。at(“caller_id”)+  “;” ;
                //匹配被叫者
                graqlInsertQuery  + =  “$ callee isa person has phone-number”  +  call。at(“callee_id”)+  “;” ;
                //插入電話
                graqlInsertQuery  + =  “insert $ call(caller:$ caller,callee:$ callee)isa call;”  +
                        “$ call已經(jīng)開(kāi)始”  +  來(lái)電。at(“started_at”)。asString()+  “;”  +
                        “$ call has duration”  +  call。在(“持續(xù)時(shí)間”)。asInteger()+  “;” ;
                return  graqlInsertQuery ;
            }
        });
        回報(bào) 輸入 ;
    }

    / **
     *將csv數(shù)據(jù)加載到我們的Grakn phone_calls鍵空間:
     * 1.將數(shù)據(jù)項(xiàng)作為json對(duì)象列表獲取
     * 2.對(duì)于每個(gè)json對(duì)象
     * 一個(gè)。創(chuàng)建Grakn事務(wù)
     * b。構(gòu)造相應(yīng)的Graql插入查詢
     * C。運(yùn)行查詢
     * d。提交交易
     * e。關(guān)閉交易
     *
     * @param輸入包含解析數(shù)據(jù)所需的詳細(xì)信息
     * @param會(huì)話將創(chuàng)建一個(gè)事務(wù)
     * @throws UnsupportedEncodingException
     * /
    static  void  loadDataIntoGrakn(輸入 輸入,Grakn。會(huì)話 會(huì)話)拋出 UnsupportedEncodingException {
        ArrayList < Json >  items  =  parseDataToJson(輸入); // 1
        物品。forEach(item  - > {
            Grakn。交易 tx  =  會(huì)話。交易(GraknTxType。WRITE); // 2a
            String  graqlInsertQuery  =  input。模板(項(xiàng)目); // 2b
            系統(tǒng)。出。println(“執(zhí)行Graql查詢:”  +  graqlInsertQuery);
            tx。graql()。解析(graqlInsertQuery)。execute(); // 2c
            tx。commit(); // 2d
            tx。close(); // 2e

        });
        系統(tǒng)。出。的println(“\ nInserted”  +  項(xiàng)目。大?。ǎ?  “由項(xiàng)目[”  +  輸入。getDataPath()+  “]。到Grakn \ n”個(gè));
    }

    / **
     * 1.通過(guò)流讀取csv文件
     * 2.將每行解析為json對(duì)象
     * 3.將json對(duì)象添加到項(xiàng)列表中
     *
     * @param輸入用于獲取數(shù)據(jù)文件的路徑,減去格式
     * @return json對(duì)象列表
     * @throws UnsupportedEncodingException
     * /
    static  ArrayList < Json >  parseDataToJson(輸入 輸入)拋出 UnsupportedEncodingException {
        ArrayList < Json >  items  =  new  ArrayList <>();

        CsvParserSettings  settings  =  new  CsvParserSettings();
        設(shè)置。setLineSeparatorDetectionEnabled(true);
        CsvParser  解析器 =  新的 CsvParser(設(shè)置);
        解析器。beginParsing(getReader(輸入。getDataPath()+  “的.csv” )); // 1

        String [] columns  =  parser。parseNext();
        String [] row ;
        而((行 =  分析器。parseNext())!=  空){
            Json  item  =  Json。object();
            對(duì)于(詮釋 我 =  0 ; 我 <  行。長(zhǎng)度 ; 我++){
                項(xiàng)目。set(columns [ i ],row [ i ]); // 2
            }
            物品。add(item); // 3
        }
        返回 的項(xiàng)目 ;
    }

    public  static  Reader  getReader(String  relativePath)throws  UnsupportedEncodingException {
        返回 新 的InputStreamReader(CsvMigration。類。getClassLoader()。的getResourceAsStream(relativePath),“UTF-8”);
    }
}

加載時(shí)間

運(yùn)行main方法,坐下來(lái),放松并觀察日志,同時(shí)數(shù)據(jù)開(kāi)始涌入Grakn。

回顧一下

  • 我們從設(shè)置項(xiàng)目和定位數(shù)據(jù)文件開(kāi)始。

  • 接下來(lái),我們繼續(xù)設(shè)置遷移機(jī)制,該機(jī)制獨(dú)立于數(shù)據(jù)格式。

  • 然后,我們了解了如何將具有不同數(shù)據(jù)格式的文件解析為JSON對(duì)象。

  • 最后,我們運(yùn)行了使用給定main方法觸發(fā)connectAndMigrate方法的方法inputs。這將數(shù)據(jù)加載到我們的Grakn知識(shí)圖中。

“怎么用Java客戶端將數(shù)據(jù)加載到Grakn知識(shí)圖中”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI