图数据库: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
上傳并解壓
[root@master 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初始化此數據庫
[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 ... okWARNING: 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啟動數據庫
[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。分類邊緣來表示他們的角色。
邊緣:連接實體的關系。每個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
DROP
DROP GRAPH graphname CASCADE;圖形具有頂點和邊的初始標簽。這些標簽不能被刪除。要刪除圖表,用戶必須使用該CASCADE選項執行此操作。如果當前graph_path是已刪除的圖形,則graph_path將重置為null。
圖形
CREATE GRAPH
如果不存在
如果相同的名字已經存在,什么也不做
授權role_name
將擁有新圖形的用戶的角色名稱
ALTER GRAPH
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 ];寫入未記錄標簽的數據不會記錄到預寫日志中,這會使未記錄的標簽比記錄的標簽快得多。但是,未記錄的標簽不是安全的。
如果相同的名字已經存在,什么也不做。
要創建的頂點/邊緣標簽的名稱。
創建帶有無效索引的標簽。無效索引不能用于搜索或插入,直到重新編制索引。
可選的INHERITS子句指定頂點/邊緣標簽的列表。如果它是空的,則新標簽繼承初始標簽。使用INHERITS會在新的子標簽和其父標簽之間創建一個持久邊緣。子標簽的數據默認包含在父級掃描中。
新標簽將在名稱為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的簡單知識
總結
以上是生活随笔為你收集整理的图数据库:AgensGraph的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SECD machine
- 下一篇: BZOJ1941:[SDOI2010]H