titan - 图遍历中的gremlin查询if-else-then

标签 titan gremlin gremlin-server

我一直试图在 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。

一直在尝试选择无果:

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 控制台 session 中的示例图形创建代码)。无论如何,这就是我认为您需要的:

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() 的所有用途做了什么 - 根据您的问题,这些似乎与您的遍历无关。

关于titan - 图遍历中的gremlin查询if-else-then,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41667056/

相关文章:

cassandra - 在 Titan 图数据库中创建顶点和边的问题

python - 灯泡:仅在尚不存在时创建顶点

database - Titan 图形数据库太慢,有 100000 多个带索引的顶点如何优化它?

graph-databases - gremlin:限制步骤与采取步骤

gremlin - 将 gremlin CLI 连接到远程 tinkerpop gremlin-server

jakarta-ee - Tinkerpop - Titan/Cassandra 项目设置

Neo4j 4.x gremlin 支持

azure-cosmosdb - Cosmos DB 搜索查询采用任意字符的顶点值

graph - 如何在 Gremlin Server Titan 1.0 中删除顶点

cassandra - gremlin 和 janusgraph 中的 OperationTimedOutException,同时将它与在 docker-container 中运行的 scylla 连接