【问题标题】:gremlin query if-else-then in the graph traversalgremlin 在图遍历中查询 if-else-then
【发布时间】:2023-11-19 21:58:01
【问题描述】:

我一直试图在 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 为真或假,如上面的 cmets 中所示。

一直在尝试选择无济于事:

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

【问题讨论】:

    标签: titan gremlin gremlin-server


    【解决方案1】:

    我不确定我是否遵循您所有步骤标签背后的推理,所以我大部分都省略了以演示 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() 的所有用途做了什么 - 根据您的问题,这些似乎与您的遍历无关。

    【讨论】: