如何在 gremlin 中搜索相同属性键的多个值

How to search multiple values for same propertykey in gremlin

使用相同的 属性 键获取值的最佳方法是什么?

编辑:很抱歉更改问题,我的要求是从两个部门中的任何一个部门招聘一名员工

我需要获取在 IT 或销售部门工作并由 ID 为 123 的经理管理的所有员工。

我用过

g.V().has('managerId',123).out('manages').as('employee')
   .out('worksFor').has('departmentName','IT','Sales')
   .select('employee')

其中 out('worksAt') 给出部门。

我们可以在 has() 步骤中执行此操作还是应该使用 union() 步骤,例如

g.V().has('managerId',123).out('manages').as('employee').out('worksFor')
    .union(__.has('departmentName','IT'),__.has('departmentName','Sales')
    .select('employee')

您可能只缺少 within predicate which is also explained in the context of the has step in the TinkerPop documentation:

g.V().has('managerId',123).out('manages').as('employee').out('worksFor').
    has('departmentName',within('IT','Sales')).select('employee')

编辑:阅读斯蒂芬的回答后,我注意到我阅读了您问题中的

employees who work for IT and Sales

这使我的回答当然无效。我仍然把它留在这里,以防万一您实际上是指 ,如您稍后使用 union 步骤所示。

这是一个示例图表:

gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV("managerId",123).as("manager").
......1>   addV("employee","A").as("A").
......2>   addV("employee","B").as("B").
......3>   addV("department", "IT").as("it").
......4>   addV("department", "Sales").as("sales").
......5>   addE("manages").from("manager").to("A").
......6>   addE("manages").from("manager").to("B").
......7>   addE("worksFor").from("A").to("it").
......8>   addE("worksFor").from("B").to("it").
......9>   addE("worksFor").from("A").to("sales").iterate()

在这种情况下,我让员工 A 在 "Sales" 和 "IT" 中,但员工 B 仅在 "IT" 中。既然你说你想要在两个部门工作的员工,员工 A 应该从查询中返回,B 应该被过滤掉。

请注意,在这种情况下使用 within 会产生错误答案:

gremlin> g.V().has('managerId',123).
......1>   out('manages').
......2>   where(out('worksFor').
......3>         has('department',within('IT','Sales'))).
......4>   valueMap()
==>[employee:[A]]
==>[employee:[B]]

如果您想要两个部门,可以采用以下方法:

gremlin> g.V().has('managerId',123).
......1>   out('manages').
......2>   where(out('worksFor').
......3>         has('department','Sales')).
......4>   where(out('worksFor').
......5>         has('department','IT')).
......6>   valueMap()
==>[employee:[A]]