摘要:把元數(shù)據(jù)信息分成和兩類,其中表示對象自身的屬性如的等,表示對象和其他元數(shù)據(jù)對象的關(guān)系如所屬的。這樣設(shè)計確保在查詢元數(shù)據(jù)時選擇是否忽略。具體實現(xiàn)以函數(shù)為例分析如何根據(jù)唯一屬性查找元數(shù)據(jù)對象。
概要
Atlas采用了分布式圖數(shù)據(jù)庫JanusGraph作為數(shù)據(jù)存儲,目的在于用有向圖靈活的存儲、查詢數(shù)據(jù)血緣關(guān)系。Atlas定義了一套atlas-graphdb-api,允許采用不同的圖數(shù)據(jù)庫引擎來實現(xiàn)api,便于切換底層存儲。所以Atlas讀寫數(shù)據(jù)的過程可以看作就是將圖數(shù)據(jù)庫對象映射成Java類的過程,基本流程如下:
元數(shù)據(jù)對象——AtlasEntity
在Atlas中所有的元數(shù)據(jù)對象都被表示為一個entity,對應(yīng)源碼中的AtlasEntity類。所有與外部的數(shù)據(jù)交互都要通過AtlasEntity來進行,主要成員變量為:
public class AtlasEntity { private String typeName; private String guid; private Mapattributes; private Map relationshipAttributes; }
attribute和relationshipAttribute的類型是寬松的,可以是String、Int、Array等基本數(shù)據(jù)類型,也可以是另外一個entity。
Atlas把元數(shù)據(jù)信息分成attributes和relationshipAttributes兩類,其中attriubtes表示對象自身的屬性如table的owner、createTime等,relationshipAttributes表示對象和其他元數(shù)據(jù)對象的關(guān)系如table所屬的db。這樣設(shè)計確保在查詢元數(shù)據(jù)時選擇是否忽略relationshipAttributes。
具體實現(xiàn)
以AtlasEntityStoreV2.getByUniqueAttributes()函數(shù)為例分析Atlas如何根據(jù)唯一屬性查找元數(shù)據(jù)對象。
step1:根據(jù)屬性查詢圖中對應(yīng)的頂點
調(diào)用AtlasGraphUtilsV2.getVertexByUniqueAttributes()函數(shù),根據(jù)uniqueAttributes查詢AtlasVertex。判斷uniqueAttribute是否建立了索引:存在索引時,底層調(diào)用JanusGraphIndexQuery進行查詢;沒有索引時,底層調(diào)用JanusGraphQuery進行查詢。
step2:將圖頂點轉(zhuǎn)換為元數(shù)據(jù)對象的屬性
Atlas對不同的屬性類型設(shè)置了不同的轉(zhuǎn)換方式,核心函數(shù)EntityGraphRetriever.mapVertexToAttribute()主要代碼如下:
switch (attrType.getTypeCategory()) { case PRIMITIVE: ret = mapVertexToPrimitive(entityVertex, attribute.getVertexPropertyName(), attribute.getAttributeDef()); break; case ENUM: ret = AtlasGraphUtilsV2.getEncodedProperty(entityVertex, attribute.getVertexPropertyName(), Object.class); break; case STRUCT: ret = mapVertexToStruct(entityVertex, edgeLabel, null, entityExtInfo, isMinExtInfo); break; case OBJECT_ID_TYPE: ret = mapVertexToObjectId(entityVertex, edgeLabel, null, entityExtInfo, isOwnedAttribute, edgeDirection, isMinExtInfo); break; case ARRAY: ret = mapVertexToArray(entityVertex, entityExtInfo, isOwnedAttribute, attribute, isMinExtInfo); break; case MAP: ret = mapVertexToMap(entityVertex, entityExtInfo, isOwnedAttribute, attribute, isMinExtInfo); break; case CLASSIFICATION: // do nothing break; }
總結(jié)attribute和vertex轉(zhuǎn)換規(guī)則
1)attribute類型為PRIMITIVE(基本數(shù)據(jù)類型):attribute對應(yīng)vertex的property
2)attribute類型為STRUCT(結(jié)構(gòu)體):根據(jù)帶有特定label的edge找到連接的_vertex,再調(diào)用mapAttributes(AtlasVertex vertex)函數(shù)轉(zhuǎn)換vertex為entity,作為當(dāng)前查詢元數(shù)據(jù)對象的屬性
3)attribute類型為ObjectId,根據(jù)帶有特定label的edge找到連接的_vertex,將_vertex的id屬性封裝成AtlasObjectId作為當(dāng)前查詢元數(shù)據(jù)對象的屬性。
4)attribute類型為ARRAY時:數(shù)組元素類型為PRIMITIVE時調(diào)用AtlasElement.getListProperty()獲取屬性內(nèi)容;數(shù)組元素類型為STRUCT、ObjectId根據(jù)label獲取List
5)attribute類型為MAP時:轉(zhuǎn)換規(guī)則與ARRAY相似
總結(jié)
在Atlas中查詢某一個元數(shù)據(jù)對象時往往需要遍歷圖數(shù)據(jù)庫中的多個頂點與邊,相比關(guān)系型數(shù)據(jù)庫直接查詢一行數(shù)據(jù)要復(fù)雜的多。尤其是當(dāng)查詢一個Array
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77437.html
摘要:概要通過函數(shù)進行數(shù)據(jù)寫入,了解這個重要函數(shù)有助于理解工作流程優(yōu)化寫入性能。舉個例子,的屬性為的客戶端向重復(fù)創(chuàng)建,屬性的值為,每次值為當(dāng)前時間戳而不同,造成元數(shù)據(jù)重復(fù)更新。 概要Atlas通過AtlasEntityStoreV2.createOrUpdate函數(shù)進行數(shù)據(jù)寫入,了解AtlasEntityStoreV2.createOrUpdate這個重要函數(shù)有助于理解Atlas工作流程、優(yōu)...
閱讀 1897·2021-11-17 09:33
閱讀 6494·2021-10-12 10:20
閱讀 2312·2021-09-22 15:50
閱讀 1799·2021-09-22 15:10
閱讀 632·2021-09-10 10:51
閱讀 638·2021-09-10 10:50
閱讀 3067·2021-08-11 11:19
閱讀 1789·2019-08-30 15:55