我一直试图在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)
基于以上评论中的true或false属性值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()
-根据您的问题,这些都与遍历无关。