簡體   English   中英

TinkerPop 沒有通過遍歷獲得正確的計數類型

[英]TinkerPop not getting correct count type with traversal

我想檢索特定范圍的用戶(分頁所需)並且還想檢索總計數,我正在執行以下查詢,該查詢按預期檢索用戶頂點列表,但總計數作為BulkSet返回

Map<String, Object> result = gt.V().hasLabel("user").sideEffect(__.count().store("total"))
    .order().by("name", Order.desc)
    .range(0, 10).fold().as("list")
    .select("list","total").next();

output如下

在此處輸入圖像描述

如何獲得正確的計數作為Long值而不是BulkSet

此處討論了使用 Gremlin 進行分頁,並參考了此博客文章,其中提供了有關該主題的更多信息。 這些資源應該可以幫助您制定分頁策略。

您在查詢BulkSet時提出了這個問題,所以它與我引用的答案並不完全重復,所以我會盡量為您回答這么多。 BulkSet允許在 TinkerPop 中進行重要的遍歷優化,這有助於減少 object 傳播,從而減少特定查詢的 memory 要求。 它通過保存遍歷器 object 及其計數來做到這一點,其中計數是 object 已添加到BulkSet的次數。 調用size()longSize() (后者返回long而前者返回int )將返回計數的總和,因此返回對象的“正確”或實際計數。 調用uniqueSize()將返回集合的實際大小,這將是其中的唯一對象。

如果你想要BulkSet的大小,你只需要count()它:

gt.V().hasLabel("user").sideEffect(__.count().store("total"))
    .order().by("name", Order.desc)
    .range(0, 10).fold().as("list")
    .select("list","total")
      .by().
      .by(count(local))

也就是說,我認為您的遍歷並沒有真正做到您想要的。 sideEffect()只是計算當前遍歷器,它將簡單地返回“1”,然后將“1”存儲在列表“total”中。 至少這是我在 TinkerGraph 中看到的:

gremlin> g.V().hasLabel("person").sideEffect(count().store("total")).range(0,1).fold().as('list').select('list','total').by().by(count(local))
==>[list:[v[1]],total:1]
gremlin> g.V().hasLabel("person").sideEffect(count().store("total")).range(0,10).fold().as('list').select('list','total').by().by(count(local))
==>[list:[v[1],v[2],v[4],v[6]],total:4]

有趣的是,JanusGraph 以某種方式為您提供了 114 而不是 10 的“總數”。 我沒想到。 如果它是后來“修復”的“錯誤”,我會考慮避免依賴該“功能”。 相反,請考慮我提供的帖子並從中尋找靈感。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM