圖資料庫:AgensGraph
文章目錄
AgensGraph簡介
AgensGraph 是一個基於 PostgreSQL 的新一代多模型圖資料庫。它提供圖形分析環境,使用者可以同時編寫、編輯和執行 SQL 和 Cypher 查詢。AgensGraph 帶有 PostgreSQL 相容性和 PostgreSQL擴充套件,能夠幫助PostgreSQL使用者擺脫資料遷移的痛苦,輕鬆開發提供高階資料分析的服務。
官網及下載
AgensGraph的官方網站:http://bitnine.net/agensgraph/
Linux版本下載:http://bitnine.net/downloads/agensgraph-v-1-3-linux/
安裝AgensGraph
上傳並解壓
[[email protected] opt]# tar -xvf AgensGraph_v1.3.1_linux.tar.gz -C /usr/local/
新增agens使用者
因為此資料庫並不能在root下執行,所以要先建好使用者。這裡官方並沒有指明特定使用者,我是自己建立的使用者。選擇的事agens
groupadd -g 530 agens useradd -g 530 -u 530 -m -d /home/agens -s /bin/bash agens
建立/agdata目錄,並賦權.資料目錄
將應用目錄和資料目錄都得設為agens使用者許可權
配置.bashrc
將安裝目錄的相關資訊填進去
export LD_LIBRARY_PATH=/usr/local/AgensGraph/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/AgensGraph/bin:$PATH
export AGDATA=/agdata
初始化並啟動
初始化資料庫
使用initdb初始化此資料庫
[[email protected] ~]$ 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 logfile start
啟動資料庫
[[email protected] ~]$ ag_ctl -D /agdata/ -l logfile start
server starting
[[email protected] ~]$ AgensGraph
執行互動式終端
建立一個數據庫:
createdb [ dbname ]
如果未指定dbname,則會預設建立與當前使用者名稱稱相同的資料庫。這裡我使用的是test02
[[email protected] ~]$ 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。分類邊緣來表示他們的角色。
邊緣:連線實體的關係。
每個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
這個表格改變了圖表的所有者。
建立label
VLABEL和ELABEL的概要是相同的。
CREATE [ UNLOGGED ] VLABEL [ IF NOT EXISTS ] label_name [DISABLE INDEX]
[ INHERITS ( parent_label_name [, ...] ) ]
[ WITH (storage_parameter)]
[ TABLESPACE tablespace_name ];
- UNLOGGED
寫入未記錄標籤的資料不會記錄到預寫日誌中,這會使未記錄的標籤比記錄的標籤快得多。但是,未記錄的標籤不是安全的。 - IF NOT EXISTS
如果相同的名字已經存在,什麼也不做。 - LABEL_NAME
要建立的頂點/邊緣標籤的名稱。 - DISABLE INDEX
建立帶有無效索引的標籤。無效索引不能用於搜尋或插入,直到重新編制索引。 - INHERITS(parent_label [,…])
可選的INHERITS子句指定頂點/邊緣標籤的列表。如果它是空的,則新標籤繼承初始標籤。使用INHERITS會在新的子標籤和其父標籤之間建立一個持久邊緣。子標籤的資料預設包含在父級掃描中。 - TABLESPACE tablespace_name
新標籤將在名稱為tablespace_name的表空間中建立。
AgensGraph查詢
介紹
為了檢索和操作圖形資料,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’});
Creating the Vertices and Edges
現在,我們可以建立一個頂點的人對和邊緣知道使用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支援的任何資料型別都可以儲存到頂點和邊的屬性中。
####查詢圖表 Querying the Graph
讓我們檢索我們上面建立的模式。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子句作為查詢的結果返回變數及其屬性。結果是在其行中具有多個匹配模式的表格。
####可變長度邊緣 Variable Length Edges
讓我們考慮一個發現“湯姆”知道知道的查詢。我們可以使用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的簡單知識