图遍历中的Gremlin查询if-else-then

3

我一直在尝试理解Gremlin查询中的if-else语句。假设g.V({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的true或false,就像上面的注释一样。我一直在尝试使用choose,但无济于事:
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查询。对我来说最糟糕的选项是构建两个单独的异步查询,基于这些结果分别构建结果。

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

TIA

1个回答

7

我不确定你标记所有步骤的推理背后的原因,因此我大多数情况下省略了它,以展示choose()的使用,这似乎是你问题的重点。根据你描述问题的方式,我粗略地近似了我认为你的图结构是什么(如果你有未来的问题,请考虑提供一些可以轻松剪切/粘贴到Gremlin控制台会话中的样本图形创建代码)。无论如何,这是我认为你需要的:

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()”方法的目的,似乎都与您的遍历操作无关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接