乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      ?知識(shí)圖譜里的知識(shí)存儲(chǔ):neo4j的介紹和使用

       漢無(wú)為 2019-08-18

      一般情況下,我們使用數(shù)據(jù)庫(kù)查找事物間的聯(lián)系的時(shí)候,只需要短程關(guān)系的查詢(兩層以內(nèi)的關(guān)聯(lián))。當(dāng)需要進(jìn)行更長(zhǎng)程的,更廣范圍的關(guān)系查詢時(shí),就需要圖數(shù)據(jù)庫(kù)的功能。

      而隨著社交、電商、金融、零售、物聯(lián)網(wǎng)等行業(yè)的快速發(fā)展,現(xiàn)實(shí)世界的事物之間織起了一張巨大復(fù)雜的關(guān)系網(wǎng),傳統(tǒng)數(shù)據(jù)庫(kù)面對(duì)這樣復(fù)雜關(guān)系往往束手無(wú)策。因此,圖數(shù)據(jù)庫(kù)應(yīng)運(yùn)而生。

      圖數(shù)據(jù)庫(kù)(Graph database)指的是以圖數(shù)據(jù)結(jié)構(gòu)的形式來(lái)存儲(chǔ)和查詢數(shù)據(jù)的數(shù)據(jù)庫(kù)。

      從 http:///en/ranking 可以發(fā)現(xiàn),Neo4j 是目前用的最多的圖數(shù)據(jù)庫(kù),世界數(shù)據(jù)庫(kù)排行榜上排名21位。

      Neo4J屬于原生圖數(shù)據(jù)庫(kù),其使用的存儲(chǔ)后端專門為圖結(jié)構(gòu)數(shù)據(jù)的存儲(chǔ)和管理進(jìn)行定制和優(yōu)化的,在圖上互相關(guān)聯(lián)的節(jié)點(diǎn)在數(shù)據(jù)庫(kù)中的物理地址也指向彼此,因此更能發(fā)揮出圖結(jié)構(gòu)形式數(shù)據(jù)的優(yōu)勢(shì)。

      知識(shí)圖譜中,知識(shí)的組織形式采用的就是圖結(jié)構(gòu),所以非常適合用neo4j進(jìn)行存儲(chǔ)。

      圖數(shù)據(jù)庫(kù)的優(yōu)勢(shì)在于:

      • 性能上,對(duì)長(zhǎng)程關(guān)系的查詢速度快

      • 擅于發(fā)現(xiàn)隱藏的關(guān)系,例如通過(guò)判斷圖上兩點(diǎn)之間有沒(méi)有走的通的路徑,就可以發(fā)現(xiàn)事物間的關(guān)聯(lián)

      數(shù)據(jù)存儲(chǔ)形式

      neo4j的數(shù)據(jù)存儲(chǔ)形式 主要是 節(jié)點(diǎn)(node)和 邊(edge) 來(lái)組織數(shù)據(jù)。node可以代表知識(shí)圖譜中的實(shí)體,edge可以用來(lái)代表實(shí)體間的關(guān)系,關(guān)系可以有方向,兩端對(duì)應(yīng)開(kāi)始節(jié)點(diǎn)和結(jié)束節(jié)點(diǎn)。
      另外,可以在node上加一個(gè)或多個(gè)標(biāo)簽(Node Label)表示實(shí)體的分類,以及一個(gè)鍵值對(duì)集合來(lái)表示該實(shí)體除了關(guān)系屬性之外的一些額外屬性。關(guān)系也可以附帶額外的屬性。

      查詢語(yǔ)言cypher

      neo4j采用自己設(shè)計(jì)的查詢語(yǔ)言cypher,其特點(diǎn)和sql有很多相似的地方。match、where、return是最常用到的關(guān)鍵詞:

      • match: 相當(dāng)于 sql中的select,用來(lái)說(shuō)明查詢匹配的數(shù)據(jù)模式(或者說(shuō)圖模式)

      • where: 用來(lái)限制node或者關(guān)系中部分屬性的屬性值,從而返回我們想要的數(shù)據(jù)

      • return: 返回節(jié)點(diǎn)或者關(guān)系

      安裝neo4j

      這里我們使用docker安裝neo4j,安裝命令行如下:

      docker run -d --name=Neo4j\
          --publish=7474:7474 --publish=7687:7687 \
          --volume=$HOME/neo4j/data:/data --volume=$HOME/neo4j/import:/import\
          neo4j

      根據(jù)配置參數(shù),我們將容器內(nèi)的7474端口掛載到外部宿主機(jī)的7474端口,并設(shè)置好文件夾的映射關(guān)系,注意/import文件夾下放的是將要導(dǎo)入數(shù)據(jù)庫(kù)的csv文件。
      接著在瀏覽器中打開(kāi) “ http://localhost:7474/ ”,就可以訪問(wèn)Neo4j管理界面了。

      我們通過(guò)一個(gè)例子來(lái)說(shuō)明如何運(yùn)用neo4j數(shù)據(jù)庫(kù)。

      1. 導(dǎo)入數(shù)據(jù)

      我們這里有兩個(gè)csv文件如下圖,左邊的nodes_companies.csv是一部分公司節(jié)點(diǎn),右邊的edges_director_duration.csv是這些公司互相之間的服務(wù)關(guān)系

      把這兩個(gè)文件放到neo4j根目錄下的import文件夾內(nèi),使用LOAD…AS row語(yǔ)句讀取,表示將csv文件按行讀取,每行的變量名為row。再使用MERGE指令創(chuàng)建節(jié)點(diǎn),將csv文件的第一列數(shù)據(jù)與第二列數(shù)據(jù)匯總為一個(gè)結(jié)點(diǎn)內(nèi)的兩條屬性信息。

      LOAD CSV WITH HEADERS FROM 'file:///nodes_companies.csv' AS row
      MERGE (c:Company {companyId:row.companyId, companyName:row.name})

      這里提一下cypher中兩個(gè)用于創(chuàng)建新的數(shù)據(jù)的兩個(gè)關(guān)鍵詞: create 和 merge

      merge:在數(shù)據(jù)庫(kù)中可以匹配到模式相同的數(shù)據(jù)就返回,沒(méi)有則創(chuàng)建一條這樣的數(shù)據(jù)(有則返回,沒(méi)有則創(chuàng)建
      create:無(wú)論如何,都會(huì)創(chuàng)建一條新的數(shù)據(jù)

      上面再LOAD文件時(shí)使用merge可以避免導(dǎo)入完全重復(fù)的數(shù)據(jù)

      通過(guò)第二個(gè)csv文件的START_ID和END_ID字段為第一個(gè)csv文件的company之間建立聯(lián)系,即不斷遍歷第二個(gè)文件的每一行,根據(jù)START_ID和END_ID使用where找到圖中相應(yīng)節(jié)點(diǎn),并為它們添加相應(yīng)的服務(wù)(INTERLOCK)關(guān)系,添加關(guān)系屬性為weight。

      LOAD CSV WITH HEADERS FROM 'file:///edges_director_duration.csv' AS row
      match (c1:company), (c2:company)
      where row.START_ID = c1.id and row.END_ID = c2.id
      create (c1)-[r:INTERLOCK{weight:row.years_served}]->(c2)

      注意在cypher語(yǔ)句里,節(jié)點(diǎn)是用()括起來(lái)表示,關(guān)系則用 [] 括起來(lái)表示

      2.創(chuàng)建關(guān)系

      這里我們嘗試自己創(chuàng)建一條新的關(guān)系,比如在id = 281 和 id = 879 的兩個(gè)節(jié)點(diǎn)間創(chuàng)建一條標(biāo)簽為“INTERLOCK”的關(guān)系。

      先match和where鎖定 id = 281 和 id = 879的兩個(gè)公司節(jié)點(diǎn),然后用create創(chuàng)建他們之間的關(guān)系,并添加特定關(guān)系屬性信息(例如weight為10)。

      cypher語(yǔ)句如下:

      MATCH (c1:company),(c2:company) 
      WHERE c1.id = “281” AND c2.id = “879” CREATE (c1)-[r:INTERLOCK{weight:10}]->(c2) RETURN (c1)-[r]-(c2)

      這條語(yǔ)句的意思是,匹配類別標(biāo)簽為company,id分別等于281和879的兩個(gè)公司節(jié)點(diǎn),設(shè)置變量名為c1和c2,在他們之間創(chuàng)建關(guān)系,關(guān)系變量名為r,這里 ()-[]-() 代表無(wú)向邊,()-[]->() 代表有向邊。

      返回結(jié)果 (c1)-[r]-(c2) 匹配到的子圖如下所示:

      3.比較復(fù)雜的查詢

      下面這條語(yǔ)句會(huì)把所有公司中,指向其他公司的連接關(guān)系數(shù)超過(guò)75條的公司全部找出來(lái)。用空括號(hào)()代表任一節(jié)點(diǎn),函數(shù)count() 計(jì)算關(guān)系的數(shù)量。

      MATCH (c:company)-[r:INTERLOCK]->() WITH c, count(r) as relaNum WHERE relaNum>=75 RETURN c,relaNum

      4.最短路徑查詢

      neo4j還還內(nèi)置實(shí)現(xiàn)了一套圖搜索算法,并提供了相關(guān)函數(shù)接口,比如你想查詢兩個(gè)節(jié)點(diǎn)之間的最短路徑,就可以用下面的查詢語(yǔ)句:

      • shortestPath():返回兩節(jié)點(diǎn)間的最短路徑

      match (c1:company), (c2:company), p=shortestPath((c1)-[r:INTERLOCK*..10]->(c2))
      where c1.id <> c2.id
      return p,length(p) order by length(p) desc limit 1000

      直接調(diào)用函數(shù)shortestPath,傳入的參數(shù)為選定的關(guān)系,選取任意兩個(gè)節(jié)點(diǎn),<>表示id不相等,因?yàn)椴檎业膬蓚€(gè)點(diǎn)不能是同一個(gè)點(diǎn),*..10表示10度以內(nèi)的所有關(guān)系,返回降序排序的長(zhǎng)度,限制在1000個(gè)防止內(nèi)存溢出)

      • allshortestpaths():返回兩節(jié)點(diǎn)間所有的最短路徑

      MATCH (c1:company), (c2:company), p = allshortestpaths((c1)-[r:INTERLOCK*]-(c2))
      WHERE c1.id <> c2.id
      RETURN 
      extract(n in nodes(p)|n.name) as Nodes, 
      length(p) as pathLength,
      reduce(s=0, e in relationships(p)| s + toInt(e.weight)) as pathDist 
      LIMIT 1000

      語(yǔ)句中的pathLength是路徑的邊數(shù)(第一句return),pathDist是路徑上所有帶weight邊的加權(quán)總和(第二句return)。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多