如何在 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]]
使用相同的 属性 键获取值的最佳方法是什么?
编辑:很抱歉更改问题,我的要求是从两个部门中的任何一个部门招聘一名员工
我需要获取在 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]]