天天看點

圖資料庫:AgensGraph

文章目錄

      • AgensGraph簡介
      • 官網及下載下傳
      • 安裝AgensGraph
        • 上傳并解壓
        • 添加agens使用者
        • 配置.bashrc
      • 初始化并啟動
        • 初始化資料庫
        • 啟動資料庫
        • 執行互動式終端
      • 圖資料庫基礎概念
        • 配置伺服器參數
        • AgensGraph資料模型
        • AgensGraph中的資料對象
        • 資料定義語言
        • 建立label
      • AgensGraph查詢
        • 介紹
        • 建立一個示例圖
        • 建立标簽
        • Creating the Vertices and Edges
        • 查詢圖表 Querying the Graph
        • 可變長度邊緣 Variable Length Edges

AgensGraph 是一個基于 PostgreSQL 的新一代多模型圖資料庫。它提供圖形分析環境,使用者可以同時編寫、編輯和執行 SQL 和 Cypher 查詢。AgensGraph 帶有 PostgreSQL 相容性和 PostgreSQL擴充,能夠幫助PostgreSQL使用者擺脫資料遷移的痛苦,輕松開發提供進階資料分析的服務。

AgensGraph的官方網站:http://bitnine.net/agensgraph/

Linux版本下載下傳:http://bitnine.net/downloads/agensgraph-v-1-3-linux/

[root@master opt]# tar -xvf AgensGraph_v1.3.1_linux.tar.gz -C /usr/local/
           

因為此資料庫并不能在root下運作,是以要先建好使用者。這裡官方并沒有指明特定使用者,我是自己建立的使用者。選擇的是agens

groupadd -g 530 agens
useradd -g 530 -u 530 -m -d /home/agens -s /bin/bash agens
           

建立/agdata目錄,并賦權.資料目錄

将應用目錄和資料目錄都得設為agens使用者權限

将安裝目錄的相關資訊填進去

export LD_LIBRARY_PATH=/usr/local/AgensGraph/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/AgensGraph/bin:$PATH
export AGDATA=/agdata
           

使用initdb初始化此資料庫

[agens@sdw3 ~]$ initdb -D /agdata/
The files belonging to this database system will be owned by user "agens".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".

The default database encoding has accordingly been set to "UTF8".

The default text search configuration will be set to "english".


Data page checksums are disabled.


fixing permissions on existing directory /agdata ... ok

creating subdirectories ... ok

selecting default max_connections ... 100

selecting default shared_buffers ... 128MB

selecting dynamic shared memory implementation ... posix

creating configuration files ... ok

running bootstrap script ... ok

performing post-bootstrap initialization ... ok

syncing data to disk ... ok


WARNING: enabling "trust" authentication for local connections

You can change this by editing pg_hba.conf or using the option -A, or

--auth-local and --auth-host, the next time you run initdb.


Success. You can now start the database server using:

       
ag_ctl -D /agdata/ -l <span class="hljs-keyword"><span class="hljs-keyword">logfile</span></span> <span class="hljs-keyword"><span class="hljs-keyword">start</span></span>
           

[agens@sdw3 ~]$ ag_ctl -D /agdata/ -l logfile start
server starting
[agens@sdw3 ~]$ AgensGraph
           

建立一個資料庫:

createdb [ dbname ]
           

如果未指定dbname,則會預設建立與目前使用者名稱相同的資料庫。這裡我使用的是test02

[agens@sdw3 ~]$ agens test02
agens (AgensGraph 1.3.1, based on PostgreSQL 9.6.2)
Type "help" for help.

test02=# 

           

為了獲得最佳性能,根據資料和機器資源的大小正确設定伺服器參數非常重要。在許多伺服器參數中,以下參數對AgensGraph圖形查詢性能至關重要。(您可以編輯$AGDATA/postgresql.conf檔案來設定這些參數(需要重新啟動))。

shared_buffers:用于緩存資料對象的記憶體大小。生産環境應該增加此參數。當它與資料大小一樣大時,它是最優的。但是,應該仔細設定此參數,以考慮為每個查詢配置設定的并發會話和記憶體大小。建議的設定是實體記憶體大小的一半。

work_mem:根據實體記憶體的大小以及将仔細執行的查詢屬性,這個值也會增加。

random_page_cost:此參數用于查詢優化。對于圖形查詢,建議将此值減小到1或0.005(如果圖形資料完全緩存在記憶體中)

AgensGraph是一個多模型資料庫。AgensGraph同時支援屬性圖模型和關系模型。

屬性圖模型

标記屬性圖模型

圖資料庫:AgensGraph

屬性圖模型包含連接配接的實體,其可以具有任意數量的屬性。在AgensGraph中,實體被稱為頂點。頂點可以具有任意數量的屬性,并可以用标簽進行分類。标簽用于對頂點進行分組以表示某些類别的頂點; 即代表一個人的角色。

邊緣是兩個頂點之間的直接連接配接。邊也可以具有屬性和歸類标簽,如頂點。在AgensGraph中,邊緣總是具有起始頂點和結束頂點。如果一個查詢試圖删除一個頂點,它必須先删除它的所有邊。AgensGraph中不存在斷邊。

邊和頂點的屬性用JSON格式表示。JSON是用于半結構化資料序列化的文本格式。JSON由六種資料類型組成:字元串,數字,布爾值,空值,對象和數組。AgensGraph對象充分利用JSON格式,将資訊存儲為零個或多個名稱/值對的無序集合。名稱是一個字元串,值可以是任何上述類型,包括嵌套的JSON類型。AgensGraph特别使用JSONB格式。由于JSONB是一種分解的二進制格式,它的處理速度比普通的JSON快得多,但代價是稍微慢一點的輸入時間。

圖資料庫:AgensGraph

在AgensGraph中,可以建立幾個資料庫,每個資料庫可以包含一個或多個模式和圖形。模式适用于關系表,而圖形對象适用于圖形資料。架構名稱和圖形名稱不能相同。頂點和邊被分組為标簽。有兩種标簽:頂點标簽和邊緣标簽。使用者可以在資料庫中建立多個圖形,但一次隻能使用一個圖形。

label

label用于對頂點和邊進行分組。使用者可以為給定label下的所有頂點建立屬性索引。可以使用label為不同類型的使用者提供通路控制,并且可以建立label層次結構以将繼承添加到label。有頂點的預設label:ag_vertex。如果建立頂點而沒有指定其label,那麼頂點将存儲在預設label中。邊緣總是有一個label。

我們将頂點标簽和邊緣标簽分别稱為VLABEL和ELABEL。

VLABEL:頂點label。分類頂點來表示他們的角色。

頂點:可以儲存屬性的實體。

ELABEL:邊緣label。分類邊緣來表示他們的角色。

邊緣:連接配接實體的關系。

圖資料庫:AgensGraph

每個label都會繼承一個或多個label。上圖顯示了邊緣label的示例層次結構。label層次類似于面向對象程式設計中的類層次結構。每個父label都包含子label資料。例如,考慮到上述層次結構,如果查詢與邊緣“朋友”比對,則結果包含“室友”label的資料。

通過幾個示例介紹圖形對象的DDL。

快速描述

要建立圖形,請使用CREATE GRAPH指令。

CREATE

CREATE GRAPH graphname;        
           

可以在資料庫中建立多個圖。為了指定要使用哪個圖形,會使用會話參數graph_path。

要顯示目前圖形路徑,請使用以下指令。

SHOW graph_path;        
           

當使用圖建立時CREATE GRAPH,如果graph_path未設定,graph_path将被設定為建立的圖。您可以使用以下指令建立多個圖并将graph_path更改為另一個圖:

SET graph_path = graphname;        
           

該graph_path是一個會話變量,是以每個用戶端必須設定graph_path查詢圖形之前。隻能為graph_path指定一個圖形名稱。查詢多個圖是不允許的。

如果使用or 語句為每個使用者或資料庫設定graph_path,則隻要連接配接資料庫就不需要運作語句。

ALTER ROLEDATABASESET graph_path

ALTER ROLE user1 IN DATABASE gdb SET graph_path TO graphname;     
ALTER DATABASE gdb SET graph_path TO graphname;                         
           

DROP

DROP GRAPH graphname CASCADE;        
           

圖形具有頂點和邊的初始标簽。這些标簽不能被删除。要删除圖表,使用者必須使用該CASCADE選項執行此操作。如果目前graph_path是已删除的圖形,則graph_path将重置為null。

圖形

CREATE GRAPH

CREATE GRAPH [ IF NOT EXISTS ] graph_name [AUTHORIZATION role_name];
           

如果不存在

如果相同的名字已經存在,什麼也不做

授權role_name

将擁有新圖形的使用者的角色名稱

ALTER GRAPH

ALTER GRAPH graph_name RENAME TO new_name;
ALTER GRAPH graph_name OWNER TO { new_owner | CURRENT_USER | SESSION_USER };
           

graph_name

現有圖形的名稱。

重命名為new_name

該表單将圖形的名稱更改為new_name。

擁有者為new_owner

這個表格改變了圖表的所有者。

VLABEL和ELABEL的概要是相同的。

CREATE [ UNLOGGED ] VLABEL [ IF NOT EXISTS ] label_name [DISABLE INDEX]
       [ INHERITS ( parent_label_name [, ...] ) ]
       [ WITH (storage_parameter)]
       [ TABLESPACE tablespace_name ];
           
  1. UNLOGGED

    寫入未記錄标簽的資料不會記錄到預寫日志中,這會使未記錄的标簽比記錄的标簽快得多。但是,未記錄的标簽不是安全的。

  2. IF NOT EXISTS

    如果相同的名字已經存在,什麼也不做。

  3. LABEL_NAME

    要建立的頂點/邊緣标簽的名稱。

  4. DISABLE INDEX

    建立帶有無效索引的标簽。無效索引不能用于搜尋或插入,直到重新編制索引。

  5. INHERITS(parent_label [,…])

    可選的INHERITS子句指定頂點/邊緣标簽的清單。如果它是空的,則新标簽繼承初始标簽。使用INHERITS會在新的子标簽和其父标簽之間建立一個持久邊緣。子标簽的資料預設包含在父級掃描中。

  6. TABLESPACE tablespace_name

    新标簽将在名稱為tablespace_name的表空間中建立。

為了檢索和操作圖形資料,AgensGraph支援Cypher查詢語言。Cypher是一種類似于SQL的聲明性語言。Cypher很容易學習,因為它的文法直覺地描述了圖形中的模式。

下文簡要說明如何使用示例圖編寫Cypher查詢。

AgensGraph可以将多個圖存儲在單個資料庫中。但是,Cypher無法辨識多個圖表。是以,AgensGraph支援額外的資料定義語言和變量來使用Cypher建立和管理圖表。

以下語句建立一個稱為網絡的圖形并将其設定為目前圖形。

CREATE GRAPH network;
SET graph_path = network;
           

在這個例子中,graph_path變量顯式設定為網絡。但是,如果在建立圖形之前沒有設定graph_path,則會在建立圖形後自動設定它。

在建立圖形資料之前,生成一個标簽是基本的。雖然這是預設值,但當在密碼的CREATE語句中指定标簽時,會自動生成标簽(可同時建立VLABEL / ELABEL)。

所有圖形元素都有一個标簽。對于頂點,如果沒有指定标簽,則将ag_vertex作為預設标簽。對于邊緣,标簽不能省略。ag_edge标簽也存在,但用于其他目的。

AgensGraph支援DDL建立這樣的标簽。

以下語句建立一個頂點标簽人員和一個邊緣标簽知道。

CREATE VLABEL person;

CREATE ELABEL knows;

CREATE (n:movie {title:‘Matrix’});

現在,我們可以建立一個頂點的人對和邊緣知道使用Cypher支架的CREATE條款。該CREATE子句建立一個由頂點和邊組成的模式。頂點的形式為:(variable:label {property: value, …}),邊有:-[variable:label {property: value, …}]-。<最左側或>最右側的附加資訊用于表示邊緣的方向。variable如果建立的頂點和邊不被引用,則可以省略。

注意:AgensGraph不支援–模式中邊緣的文法,因為–意味着對行尾進行注釋。

以下陳述創造了三種簡單的模式:“湯姆知道夏天”,“帕特知道尼基”和“橄榄知道托德”。

CREATE (:person {name: 'Tom'})-[:knows {fromdate:'2011-11-24'}]->(:person {name: 'Summer'});
CREATE (:person {name: 'Pat'})-[:knows {fromdate:'2013-12-25'}]->(:person {name: 'Nikki'});
CREATE (:person {name: 'Olive'})-[:knows {fromdate:'2015-01-26'}]->(:person {name: 'Todd'});
MATCH (p:Person {name: 'Tom'}),(k:Person{name: 'Pat'}) 
CREATE (p)-[:KNOWS {fromdate:'2017-02-27'} ]->(k);
           

為了存儲頂點和邊的屬性,AgensGraph使用PostgreSQL的jsonb類型。屬性可以嵌套JSON對象作為它們的值。由于AgensGraph使用PostgreSQL的類型系統,是以PostgreSQL支援的任何資料類型都可以存儲到頂點和邊的屬性中。

讓我們檢索我們上面建立的模式。Cypher有MATCH條款在圖表中查找模式。

以下陳述發現了這樣的模式:“一個叫湯姆的人認識一個人”。

MATCH (n:person {name: 'Tom'})-[:knows]->(m:person) RETURN n.name AS n, m.name AS m;
   n   |    m
-------+----------
 "Tom" | "Summer"
 "Tom" | "Pat"
(2 rows)
           

由于屬性是jsonb類型的,我們需要方法來通路它們的屬性值。PostgreSQL支援通過營運商,如那些方法->,->>,#>,和#>>。如果使用者想要通路頂點m的屬性名稱,可以寫入。AgensGraph提供了另一種通路這些元素的方法。AgensGraph 在頂點和邊上使用點運算符和括号運算符來通路JSON對象中的屬性值和JSON數組中的元素,如上所示。(m)->>name.[]

該RETURN子句作為查詢的結果傳回變量及其屬性。結果是在其行中具有多個比對模式的表格。

讓我們考慮一個發現“湯姆”知道知道的查詢。我們可以使用UNION子句:

MATCH (p:person {name: 'Tom'})-[:knows]->(f:person)
RETURN f.name
UNION ALL
MATCH (p:person {name: 'Tom'})-[:knows]->()-[:knows]->(f:person)
RETURN f.name;
           

它也可以寫成:

MATCH (p:person {name: 'Tom'})-[r:knows*1..2]->(f:person)
RETURN f.name, r[1].fromdate;
           

查找位于可變長度的邊緣頂點路徑之後的頂點的查詢在圖形資料庫中是典型的。*1…2用于邊緣表示這樣的可變長度的邊緣。1邊緣的最小長度在哪裡,并且2是最大長度。如果您未指定值,則預設範圍值為1且無窮大。

以上就是我閑暇時間所看所學的一些關于AgensGraph的簡單知識

原文位址:https://blog.csdn.net/qq_43303221/article/details/83544083                 </div>