图数据库:AgensGraph
AgensGraph簡介
AgensGraph 是一個(gè)基于 PostgreSQL 的新一代多模型圖數(shù)據(jù)庫。它提供圖形分析環(huán)境,用戶可以同時(shí)編寫、編輯和執(zhí)行 SQL 和 Cypher 查詢。AgensGraph 帶有 PostgreSQL 兼容性和 PostgreSQL擴(kuò)展,能夠幫助PostgreSQL用戶擺脫數(shù)據(jù)遷移的痛苦,輕松開發(fā)提供高級數(shù)據(jù)分析的服務(wù)。
官網(wǎng)及下載
AgensGraph的官方網(wǎng)站: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用戶
因?yàn)榇藬?shù)據(jù)庫并不能在root下運(yùn)行,所以要先建好用戶。這里官方并沒有指明特定用戶,我是自己創(chuàng)建的用戶。選擇的事agens
groupadd -g 530 agens useradd -g 530 -u 530 -m -d /home/agens -s /bin/bash agens創(chuàng)建/agdata目錄,并賦權(quán).數(shù)據(jù)目錄
將應(yīng)用目錄和數(shù)據(jù)目錄都得設(shè)為agens用戶權(quán)限
配置.bashrc
將安裝目錄的相關(guān)信息填進(jìn)去
export LD_LIBRARY_PATH=/usr/local/AgensGraph/lib:$LD_LIBRARY_PATH export PATH=/usr/local/AgensGraph/bin:$PATH export AGDATA=/agdata初始化并啟動
初始化數(shù)據(jù)庫
使用initdb初始化此數(shù)據(jù)庫
[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啟動數(shù)據(jù)庫
[agens@sdw3 ~]$ ag_ctl -D /agdata/ -l logfile start server starting [agens@sdw3 ~]$ AgensGraph執(zhí)行交互式終端
創(chuàng)建一個(gè)數(shù)據(jù)庫:
createdb [ dbname ]如果未指定dbname,則會默認(rèn)創(chuàng)建與當(dāng)前用戶名稱相同的數(shù)據(jù)庫。這里我使用的是test02
[agens@sdw3 ~]$ agens test02 agens (AgensGraph 1.3.1, based on PostgreSQL 9.6.2) Type "help" for help.test02=#圖數(shù)據(jù)庫基礎(chǔ)概念
配置服務(wù)器參數(shù)
為了獲得最佳性能,根據(jù)數(shù)據(jù)和機(jī)器資源的大小正確設(shè)置服務(wù)器參數(shù)非常重要。在許多服務(wù)器參數(shù)中,以下參數(shù)對AgensGraph圖形查詢性能至關(guān)重要。(您可以編輯$AGDATA/postgresql.conf文件來設(shè)置這些參數(shù)(需要重新啟動))。
shared_buffers:用于緩存數(shù)據(jù)對象的內(nèi)存大小。生產(chǎn)環(huán)境應(yīng)該增加此參數(shù)。當(dāng)它與數(shù)據(jù)大小一樣大時(shí),它是最優(yōu)的。但是,應(yīng)該仔細(xì)設(shè)置此參數(shù),以考慮為每個(gè)查詢分配的并發(fā)會話和內(nèi)存大小。建議的設(shè)置是物理內(nèi)存大小的一半。
work_mem:根據(jù)物理內(nèi)存的大小以及將仔細(xì)執(zhí)行的查詢屬性,這個(gè)值也會增加。
random_page_cost:此參數(shù)用于查詢優(yōu)化。對于圖形查詢,建議將此值減小到1或0.005(如果圖形數(shù)據(jù)完全緩存在內(nèi)存中)
AgensGraph數(shù)據(jù)模型
AgensGraph是一個(gè)多模型數(shù)據(jù)庫。AgensGraph同時(shí)支持屬性圖模型和關(guān)系模型。
屬性圖模型
標(biāo)記屬性圖模型
屬性圖模型包含連接的實(shí)體,其可以具有任意數(shù)量的屬性。在AgensGraph中,實(shí)體被稱為頂點(diǎn)。頂點(diǎn)可以具有任意數(shù)量的屬性,并可以用標(biāo)簽進(jìn)行分類。標(biāo)簽用于對頂點(diǎn)進(jìn)行分組以表示某些類別的頂點(diǎn); 即代表一個(gè)人的角色。
邊緣是兩個(gè)頂點(diǎn)之間的直接連接。邊也可以具有屬性和歸類標(biāo)簽,如頂點(diǎn)。在AgensGraph中,邊緣總是具有起始頂點(diǎn)和結(jié)束頂點(diǎn)。如果一個(gè)查詢試圖刪除一個(gè)頂點(diǎn),它必須先刪除它的所有邊。AgensGraph中不存在斷邊。
邊和頂點(diǎn)的屬性用JSON格式表示。JSON是用于半結(jié)構(gòu)化數(shù)據(jù)序列化的文本格式。JSON由六種數(shù)據(jù)類型組成:字符串,數(shù)字,布爾值,空值,對象和數(shù)組。AgensGraph對象充分利用JSON格式,將信息存儲為零個(gè)或多個(gè)名稱/值對的無序集合。名稱是一個(gè)字符串,值可以是任何上述類型,包括嵌套的JSON類型。AgensGraph特別使用JSONB格式。由于JSONB是一種分解的二進(jìn)制格式,它的處理速度比普通的JSON快得多,但代價(jià)是稍微慢一點(diǎn)的輸入時(shí)間。
AgensGraph中的數(shù)據(jù)對象
在AgensGraph中,可以創(chuàng)建幾個(gè)數(shù)據(jù)庫,每個(gè)數(shù)據(jù)庫可以包含一個(gè)或多個(gè)模式和圖形。模式適用于關(guān)系表,而圖形對象適用于圖形數(shù)據(jù)。架構(gòu)名稱和圖形名稱不能相同。頂點(diǎn)和邊被分組為標(biāo)簽。有兩種標(biāo)簽:頂點(diǎn)標(biāo)簽和邊緣標(biāo)簽。用戶可以在數(shù)據(jù)庫中創(chuàng)建多個(gè)圖形,但一次只能使用一個(gè)圖形。
label
label用于對頂點(diǎn)和邊進(jìn)行分組。用戶可以為給定label下的所有頂點(diǎn)創(chuàng)建屬性索引。可以使用label為不同類型的用戶提供訪問控制,并且可以創(chuàng)建label層次結(jié)構(gòu)以將繼承添加到label。有頂點(diǎn)的默認(rèn)label:ag_vertex。如果創(chuàng)建頂點(diǎn)而沒有指定其label,那么頂點(diǎn)將存儲在默認(rèn)label中。邊緣總是有一個(gè)label。
我們將頂點(diǎn)標(biāo)簽和邊緣標(biāo)簽分別稱為VLABEL和ELABEL。
VLABEL:頂點(diǎn)label。分類頂點(diǎn)來表示他們的角色。
頂點(diǎn):可以保存屬性的實(shí)體。ELABEL:邊緣label。分類邊緣來表示他們的角色。
邊緣:連接實(shí)體的關(guān)系。每個(gè)label都會繼承一個(gè)或多個(gè)label。上圖顯示了邊緣label的示例層次結(jié)構(gòu)。label層次類似于面向?qū)ο缶幊讨械念悓哟谓Y(jié)構(gòu)。每個(gè)父label都包含子label數(shù)據(jù)。例如,考慮到上述層次結(jié)構(gòu),如果查詢與邊緣“朋友”匹配,則結(jié)果包含“室友”label的數(shù)據(jù)。
數(shù)據(jù)定義語言
通過幾個(gè)示例介紹圖形對象的DDL。
快速描述
要創(chuàng)建圖形,請使用CREATE GRAPH命令。
CREATE
CREATE GRAPH graphname;可以在數(shù)據(jù)庫中創(chuàng)建多個(gè)圖。為了指定要使用哪個(gè)圖形,會使用會話參數(shù)graph_path。
要顯示當(dāng)前圖形路徑,請使用以下命令。
SHOW graph_path;當(dāng)使用圖創(chuàng)建時(shí)CREATE GRAPH,如果graph_path未設(shè)置,graph_path將被設(shè)置為創(chuàng)建的圖。您可以使用以下命令創(chuàng)建多個(gè)圖并將graph_path更改為另一個(gè)圖:
SET graph_path = graphname;該graph_path是一個(gè)會話變量,所以每個(gè)客戶端必須設(shè)置graph_path查詢圖形之前。只能為graph_path指定一個(gè)圖形名稱。查詢多個(gè)圖是不允許的。
如果使用or 語句為每個(gè)用戶或數(shù)據(jù)庫設(shè)置graph_path,則只要連接數(shù)據(jù)庫就不需要運(yùn)行語句。
ALTER ROLEDATABASESET graph_path
DROP
DROP GRAPH graphname CASCADE;圖形具有頂點(diǎn)和邊的初始標(biāo)簽。這些標(biāo)簽不能被刪除。要刪除圖表,用戶必須使用該CASCADE選項(xiàng)執(zhí)行此操作。如果當(dāng)前graph_path是已刪除的圖形,則graph_path將重置為null。
圖形
CREATE GRAPH
如果不存在
如果相同的名字已經(jīng)存在,什么也不做
授權(quán)role_name
將擁有新圖形的用戶的角色名稱
ALTER GRAPH
graph_name
現(xiàn)有圖形的名稱。重命名為new_name
該表單將圖形的名稱更改為new_name。擁有者為new_owner
這個(gè)表格改變了圖表的所有者。創(chuàng)建label
VLABEL和ELABEL的概要是相同的。
CREATE [ UNLOGGED ] VLABEL [ IF NOT EXISTS ] label_name [DISABLE INDEX][ INHERITS ( parent_label_name [, ...] ) ][ WITH (storage_parameter)][ TABLESPACE tablespace_name ];寫入未記錄標(biāo)簽的數(shù)據(jù)不會記錄到預(yù)寫日志中,這會使未記錄的標(biāo)簽比記錄的標(biāo)簽快得多。但是,未記錄的標(biāo)簽不是安全的。
如果相同的名字已經(jīng)存在,什么也不做。
要創(chuàng)建的頂點(diǎn)/邊緣標(biāo)簽的名稱。
創(chuàng)建帶有無效索引的標(biāo)簽。無效索引不能用于搜索或插入,直到重新編制索引。
可選的INHERITS子句指定頂點(diǎn)/邊緣標(biāo)簽的列表。如果它是空的,則新標(biāo)簽繼承初始標(biāo)簽。使用INHERITS會在新的子標(biāo)簽和其父標(biāo)簽之間創(chuàng)建一個(gè)持久邊緣。子標(biāo)簽的數(shù)據(jù)默認(rèn)包含在父級掃描中。
新標(biāo)簽將在名稱為tablespace_name的表空間中創(chuàng)建。
AgensGraph查詢
介紹
為了檢索和操作圖形數(shù)據(jù),AgensGraph支持Cypher查詢語言。Cypher是一種類似于SQL的聲明性語言。Cypher很容易學(xué)習(xí),因?yàn)樗恼Z法直觀地描述了圖形中的模式。
下文簡要說明如何使用示例圖編寫Cypher查詢。
創(chuàng)建一個(gè)示例圖
AgensGraph可以將多個(gè)圖存儲在單個(gè)數(shù)據(jù)庫中。但是,Cypher無法辨別多個(gè)圖表。因此,AgensGraph支持額外的數(shù)據(jù)定義語言和變量來使用Cypher創(chuàng)建和管理圖表。
以下語句創(chuàng)建一個(gè)稱為網(wǎng)絡(luò)的圖形并將其設(shè)置為當(dāng)前圖形。
CREATE GRAPH network; SET graph_path = network;在這個(gè)例子中,graph_path變量顯式設(shè)置為網(wǎng)絡(luò)。但是,如果在創(chuàng)建圖形之前沒有設(shè)置graph_path,則會在創(chuàng)建圖形后自動設(shè)置它。
創(chuàng)建標(biāo)簽
在創(chuàng)建圖形數(shù)據(jù)之前,生成一個(gè)標(biāo)簽是基本的。雖然這是默認(rèn)值,但當(dāng)在密碼的CREATE語句中指定標(biāo)簽時(shí),會自動生成標(biāo)簽(可同時(shí)創(chuàng)建VLABEL / ELABEL)。
所有圖形元素都有一個(gè)標(biāo)簽。對于頂點(diǎn),如果沒有指定標(biāo)簽,則將ag_vertex作為默認(rèn)標(biāo)簽。對于邊緣,標(biāo)簽不能省略。ag_edge標(biāo)簽也存在,但用于其他目的。
AgensGraph支持DDL創(chuàng)建這樣的標(biāo)簽。
以下語句創(chuàng)建一個(gè)頂點(diǎn)標(biāo)簽人員和一個(gè)邊緣標(biāo)簽知道。
CREATE VLABEL person;
CREATE ELABEL knows;
CREATE (n:movie {title:'Matrix'});
Creating the Vertices and Edges
現(xiàn)在,我們可以創(chuàng)建一個(gè)頂點(diǎn)的人對和邊緣知道使用Cypher支架的CREATE條款。該CREATE子句創(chuàng)建一個(gè)由頂點(diǎn)和邊組成的模式。頂點(diǎn)的形式為:(variable:label {property: value, ...}),邊有:-[variable:label {property: value, ...}]-。<最左側(cè)或>最右側(cè)的附加信息用于表示邊緣的方向。variable如果創(chuàng)建的頂點(diǎn)和邊不被引用,則可以省略。
注意:AgensGraph不支持--模式中邊緣的語法,因?yàn)?-意味著對行尾進(jìn)行注釋。
以下陳述創(chuàng)造了三種簡單的模式:“湯姆知道夏天”,“帕特知道尼基”和“橄欖知道托德”。
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);為了存儲頂點(diǎn)和邊的屬性,AgensGraph使用PostgreSQL的jsonb類型。屬性可以嵌套JSON對象作為它們的值。由于AgensGraph使用PostgreSQL的類型系統(tǒng),因此PostgreSQL支持的任何數(shù)據(jù)類型都可以存儲到頂點(diǎn)和邊的屬性中。
查詢圖表 Querying the Graph
讓我們檢索我們上面創(chuàng)建的模式。Cypher有MATCH條款在圖表中查找模式。
以下陳述發(fā)現(xiàn)了這樣的模式:“一個(gè)叫湯姆的人認(rèn)識一個(gè)人”。
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支持通過運(yùn)營商,如那些方法->,->>,#>,和#>>。如果用戶想要訪問頂點(diǎn)m的屬性名稱,可以寫入。AgensGraph提供了另一種訪問這些元素的方法。AgensGraph 在頂點(diǎn)和邊上使用點(diǎn)運(yùn)算符和括號運(yùn)算符來訪問JSON對象中的屬性值和JSON數(shù)組中的元素,如上所示。(m)->>name.[]
該RETURN子句作為查詢的結(jié)果返回變量及其屬性。結(jié)果是在其行中具有多個(gè)匹配模式的表格。
可變長度邊緣 Variable Length Edges
讓我們考慮一個(gè)發(fā)現(xiàn)“湯姆”知道知道的查詢。我們可以使用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;查找位于可變長度的邊緣頂點(diǎn)路徑之后的頂點(diǎn)的查詢在圖形數(shù)據(jù)庫中是典型的。*1..2用于邊緣表示這樣的可變長度的邊緣。1邊緣的最小長度在哪里,并且2是最大長度。如果您未指定值,則默認(rèn)范圍值為1且無窮大。
以上就是我閑暇時(shí)間所看所學(xué)的一些關(guān)于AgensGraph的簡單知識
總結(jié)
以上是生活随笔為你收集整理的图数据库:AgensGraph的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SECD machine
- 下一篇: 面试题解(3):SQL