如何编写一个gremlin查询来查找其他顶点之间的公共顶点,并返回按重叠计数排序的结果?

如何编写一个gremlin查询来查找其他顶点之间的公共顶点,并返回按重叠计数排序的结果?,gremlin,graph-databases,amazon-neptune,graph-traversal,gremlinpython,Gremlin,Graph Databases,Amazon Neptune,Graph Traversal,Gremlinpython,我正在使用python+gremlin来实现我的图形查询,但仍然远未理解许多概念,并且遇到了一个我不知道如何执行的有趣查询 假设我们有许多带有标签chef的厨师顶点,带有标签配料的配料顶点,以及菜肴顶点菜肴。在任何给定的时间,厨师都可以在手边使用配料,在厨师和配料之间有一条边,称为has。菜肴有配料,在菜肴和配料之间有一条边,称为使用。Chef和disk之间还有一条边,表示他/她以前是否做过,称为madeBefore 也许是显而易见的,但有些菜是厨师从未做过的,并非所有的菜都使用所有的配料,厨师

我正在使用python+gremlin来实现我的图形查询,但仍然远未理解许多概念,并且遇到了一个我不知道如何执行的有趣查询

假设我们有许多带有标签
chef
的厨师顶点,带有标签
配料
的配料顶点,以及菜肴顶点
菜肴
。在任何给定的时间,厨师都可以在手边使用配料,在
厨师
配料
之间有一条边,称为
has
。菜肴有配料,在
菜肴
配料
之间有一条边,称为
使用
Chef
disk
之间还有一条边,表示他/她以前是否做过,称为
madeBefore

也许是显而易见的,但有些菜是厨师从未做过的,并非所有的菜都使用所有的配料,厨师很可能也没有所有的配料

我想创建一个查询,该查询执行以下操作:

获取厨师从未制作过的菜肴,按照厨师必须制作的食材最多的菜肴进行分类(如果能够获得比例就太好了)。所以结果中的第一道菜是厨师从来没有做过的,也许还有所有的配料要做,在结果中间的某个地方是他们从未做过的菜,大约有一半的原料需要做。最后一道菜是他们从未做过的,而且几乎没有制作所需的配料

以下查询将查找厨师从未做过的所有菜肴:

g.V()\
.hasLabel(“碟”)\
.过滤器(
__.不是_(
__.in_uuu(“madeBefore”)。有(“厨师”、“姓名”、“chefbot1”)
))\
.valueMap(真)\
托利斯先生()
但从这里开始,我就不知道从哪里开始,以便根据厨师的食材数量对这些菜肴进行分类

我的另一个想法是查询配料,然后使用
project
获得连接厨师和菜肴的边数,然后以某种方式进行过滤,但我不知道接下来该怎么做:

g.V()\
.hasLabel(“成分”)\
.过滤器(
__例如:(主厨、姓名、厨师)\
.项目(“v”、“DishesusingCredit”)\
.by(valueMap(真实))\
.by(inE().hasLabel(“使用”).count())\
.order().by(“disheusingedint”,order.desc)\
托利斯先生()

我现在对Gremlin的问题是理解如何将更复杂的查询链接在一起,是否有人能对如何解决此类问题有所启发?

如果我理解您的描述,您可以这样做:

g.V().hasLabel('Dish').
  filter(__.not(__.in('madeBefore').
      has('Chef', 'name', 'chefbot1'))).
  group().by('name').
    by(out('uses').in('has').
      has('Chef', 'name', 'chefbot1').count())
  .order(local).by(values)
示例:

。。。那是一个很棒的网站,我不知道它的存在。你的回答帮助我理解了如何构造这样的查询。最后,我在
group().by().by()
块中的第二个
by()
语句中使用了您的代码,并在
项目(“重叠计数”、“totalIngredientsCount”).by().by()
语句中使用了您的代码,同时查询了该菜肴使用的食材总数,然后我可以
.order().by()
范围()
对结果列表进行分页,然后我可以使用一个简单的函数在得到结果后返回比率