[英]Gremlin query to count vertices without a certain edge
我在 AWS 中有一個 Neptune 數據庫,其圖表如下:
所以有一個用戶組織了一個聚會並創建了兩個邀請。 但是用戶已經撤回了其中一個邀請。
我正在尋找一個查詢來計算尚未撤回的邀請數量(在上述情況下為 1)。
我找到了獲得邀請的方法(我正在使用Gremlin package for Javascript ):
const result = await g
.V("user#123")
.inE().hasLabel("createdBy")
.otherV()
.toList();
但我似乎找不到任何東西來過濾那些已撤回的邀請。 我不認為我可以遍歷未withdrawnBy
的邊,因為那仍會返回 2(因為我們有一個createdBy
和一個withdrawnBy
的邊)。
有人有任何指示嗎? 我找到了這個答案,它建議:
gremlin> g.V.filter{!it.bothE('knows').hasNext()}
我假設這是 Groovy,但我使用的是 Javascript(實際上是打字稿)。 我試過.filter()
function,但這似乎引發了錯誤:
.filter(function(this: any) {
return !this.bothE("isRevokedBy");
})
你可以這樣做:
g.V("user#123").as('u').
in('createdBy').
not(where(out('withdrawnBy').as('u')))
例如: https://gremlify.com/crjfj88qrtfd8
但我認為最好在createdBy
邊緣上添加一個屬性,表明它已被撤銷,而不是在它們之間添加另一個邊緣。
像這樣:
g.V("user#123").
inE('createdBy').not(has('withdrawn', true)).outV()
例如: https://gremlify.com/csfdv6w7325mb
當您使用 JavaScript package 時,這是可以工作的代碼:
const gremlin = require("gremlin");
const __ = gremlin.process.statics;
const traversal = gremlin.process.AnonymousTraversalSource.traversal;
const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;
const dc = new DriverRemoteConnection("ws://localhost:8182/gremlin");
const g = traversal().withRemote(dc);
const result = await g
.V("user#123")
.in_("createdBy")
.where(__.not(__.out("withdrawnBy")))
.toList()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.