如何写一个gremlin查询,找到其他顶点之间的共同顶点,并按重叠数排序返回?

问题描述 投票:0回答:1

我正在用python+gremlin实现我的图查询,但对很多概念还是远远没有理解,遇到一个有趣的查询不知道怎么做。

比如说我们有一些厨师顶点,标签是 Chef,带标签的原料顶点 Ingredient和碟形顶点 Dish. 在任何时候,厨师手头都有可以使用的食材,用一条边来表示。ChefIngredient 叫做 has. 菜肴中的原料,用边缘表示,介于两者之间。DishIngredient 叫做 uses. 也有一个边缘之间的 ChefDish 表明他是否曾经做过,叫作 madeBefore.

可能是显而易见的,但有些菜品是厨师从来没有做过的,而且不是所有的菜品都使用所有的原料,厨师很可能没有所有的原料。

我想创建一个查询,它可以做到以下几点。

获取厨师从未做过的菜品 按厨师做菜所需材料最多的菜品排序(如果能得到比例就更好了) 所以,结果中的第一道菜是厨师从未做过的菜,而且可能有所有的材料可以做,结果中间的某个地方是他们从未做过的菜,而且有大约一半的材料可以做,最后将是他们从未做过的菜,而且也几乎没有材料可以做。

下面的查询可以找到所有厨师从未做过的菜。

g.V()\
    .hasLabel("Dish")\
    .filter(
        __.not_(
            __.in_("madeBefore").has("Chef", "name", "chefbot1")
        ))\
    .valueMap(True)\
    .toList()

但从这里开始我就不知道该从哪里入手 根据厨师所拥有的食材数量对菜品进行分类了

我的另一个想法是,改用查询食材的方式,用 project 来获取连接厨师和菜品的边缘数,然后再通过某种方式进行过滤,但我不知道之后该怎么做。

g.V()\
    .hasLabel("Ingredient")\
    .filter(
        __.in_("has").has("Chef", "name", "chefbot1"))\
    .project("v", "dishesUsingIngredient")\
    .by(valueMap(True))\
    .by(inE().hasLabel("uses").count())\
    .order().by("dishesUsingIngredient", Order.desc)\
    .toList()

我现在用Gremlin的问题是理解如何把比较复杂的查询链起来,有没有人可以指点一下如何解决这种问题?

gremlin graph-databases amazon-neptune graph-traversal gremlinpython
1个回答
4
投票

如果我理解你的描述,你可以做这样的事情。

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)

例如: https:/gremlify.com8w

© www.soinside.com 2019 - 2024. All rights reserved.