簡體   English   中英

gremlin查詢是否遍歷圖

[英]gremlin query if-else-then in the graph traversal

我一直試圖在Gremlin查詢中弄清楚這個if-else。 假設gV({0})是下面的組頂點。

    var q = "g.V({0}).as('groupName', 'groupId', 'ownerId').inE(eIsAdminOf, eIsMemberOf).as('rel', 'joinDate').outV().hasLabel(userLabel).as('memberId')";
  //TODO:var q = "g.V({0}).as('groupName', 'groupId', 'ownerId').inE(eIsAdminOf";
  //if .has('mCanList',true).inE(eIsAdminOf, eIsMemberOf)
  //if .has('mCanList',false).inE(eIsAdminOf)

  //, eIsMemberOf).as('rel', 'joinDate').outV().hasLabel(userLabel).as('memberId')";

我希望.inE(eIsAdminOf, eIsMemberOf)基於真或假的屬性值mCanList,如上面的注釋所示。

一直嘗試無濟於事:

var q = "g.V({0}).as('groupName', 'groupId', 'ownerId','mCanList');
  q += ".by(values('mCanList').choose(is(true),.inE(eIsAdminOf, eIsMemberOf), .inE(eIsAdminOf))";
  q += '.as('rel', 'joinDate').outV().hasLabel(userLabel).as('memberId')”;

我正在使用node.js與gremlin庫一起構建gremlin查詢。 對我而言,最糟糕的選擇是構建2個獨立的異步查詢,這些查詢分別基於

if .has('mCanList',true).inE(eIsAdminOf, eIsMemberOf) or
 if .has('mCanList',false).inE(eIsAdminOf) 

TIA

我不確定我是否遵循您所擁有的所有步驟標簽背后的原因,因此我大部分都省略了它來演示使用choose() ,這似乎是您問題的重點。 我大致根據您對問題的描述方式來近似地認為您的圖形結構(如果您將來有疑問,請考慮提供一些示例圖形創建代碼,這些代碼可以輕松地剪切/粘貼到Gremlin Console會話中)。 無論如何,這是我認為您需要的:

gremlin>  g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV(id,1).property("mCanList",true).as('a').
......1>   addV(id,2).as('b').
......2>   addV(id,3).as('c').
......3>   addE("isAdminOf").from("b").to("a").
......4>   addE("isMemberOf").from("c").to("a").iterate()
gremlin> g.V(1).choose(has('mCanList',true),inE("isAdminOf","isMemberOf"),inE("isAdminOf"))
==>e[1][2-isAdminOf->1]
==>e[2][3-isMemberOf->1]
gremlin> 
gremlin> g.V(1).property('mCanList',false)
==>v[1]
gremlin> g.V(1).choose(has('mCanList',true),inE("isAdminOf","isMemberOf"),inE("isAdminOf"))
==>e[1][2-isAdminOf->1]

如果我嘗試直接編輯您的Gremlin,我認為您的遍歷基本上只需要像這樣:

var q = "g.V({0});
  q += ".choose(has('mCanList',true),inE(eIsAdminOf, eIsMemberOf), inE(eIsAdminOf))";
  q += ".outV().hasLabel(userLabel)"; 

我假設“ eIsAdminOf”,“ eIsMemberOf”和“ userLabel”是JS變量-如果不是,它們恰好是實際的標簽名稱時,它們將需要用引號引起來。 同樣,我不清楚您對as()所有使用都在做什么—根據您的問題,這些似乎都與您的遍歷無關。

暫無
暫無

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

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