[英]Are multiple vertex labels in Gremlin/Janusgraph possible, or is an alternative solution better?
我正在為新的圖形數據庫開發導入運行程序。
它需要與:
Amazon Neptune - Gremlin 實施,在生產中有很好的基礎設施支持,但在本地工作很痛苦,並且不支持 Cypher。 沒有提供可視化工具。
Janusgraph - 作為 Gremlin 實現在本地易於使用,但需要大量投資來支持生產,因此使用 Amazon Neptune。 沒有提供可視化工具。
Neo4j - 優秀的可視化工具,Cypher 語言感覺很熟悉,甚至可以與 Gremlin 客戶端一起使用,但需要大量投資來支持生產,並且似乎沒有任何可視化工具能與 Neo4j 中的可視化工具相媲美Gremlin 實現。
因此,我正在創建實體(節點/頂點)具有多種類型(標簽)的圖形,其中一些類型彼此正交,並且是多維的。
例如,代表在線訂單的實體將被標記為Order
、 Online
、 Spend
、 Transaction
。
| Spend Chargeback
----------------------------------------
Transaction | Purchase Refund
Line | Sale Return
放大Spend
列。
| Online Instore
----------------------------------------
Purchase | Order InstorePurchase
Sale | OnlineSale InstoreSale
在 Neo4j 及其 Cypher 查詢語言中,這被證明對於在不明確知道圖中的transaction_id
值是什么的情況下創建跨多種類型的關系/邊非常強大:
MATCH (a:Transaction), (b:Line)
WHERE a.transaction_id = b.transaction_id
MERGE (a)<-[edge:TRANSACTED_IN]-(b)
RETURN count(edge);
問題是,Gremlin/Tinkerpop 本身並不支持其頂點的多個標簽。
像AWS Neptune這樣的服務器實現將使用分隔符來支持這一點,例如。 Order::Online::Spend::Transaction
和Gremlin 客戶端確實支持它用於 Neo4j 服務器,但我無法找到適用於 JanusGraph 的示例。
最終,我需要能夠運行一個相當於上面 Cypher 的 Gremlin 查詢:
g
.V().hasLabel("Line").as("b")
.V().hasLabel("Transaction").as("a")
.where("b", eq("a")).by("transaction_id")
.addE("TRANSACTED_IN").from("b").to("a")';
所以這里有多個問題:
Transaction
)還是低級標簽( Order
)?有沒有辦法讓 JanusGraph 接受多個頂點標簽?
不,沒有辦法在 JanusGraph 中擁有多個頂點標簽。
如果不可能,或者這不是最好的方法,是否應該有一個包含標簽列表的附加頂點屬性?
在選項2的情況下,標簽名稱應該是高級標簽(Transaction)還是低級標簽(Order)?
這兩個我一並回答。 根據您上面的描述,我將創建一個標簽,可能命名為 Transaction,並具有與其關聯的不同屬性,例如位置(在線或店內)和類型(購買、退款、退貨、退款等)。 看看你如何描述上面的問題,你實際上只是在談論一個單一的實體,一個交易,其中你用作標簽的所有其他項目(在線/店內,支出/退款)實際上只是關於該交易如何發生的附加元數據。 因此,上述方法將允許對這些屬性中的一個或多個進行簡單過濾,以實現您在 Neo4j 中使用的多個標簽可以完成的任何事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.