【问题标题】:How to write a gremlin query that finds common vertices between other vertices and return sorted by the count of overlap?如何编写一个 gremlin 查询来查找其他顶点之间的公共顶点并按重叠计数排序返回?
【发布时间】:2020-05-12 13:52:40
【问题描述】:

我正在使用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】:

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

    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.com/8w

    【讨论】:

    • gremlify.com... 这是一个我不知道存在的很棒的网站。您的回答对我理解如何构建此类查询有很大帮助。我最终在group().by().by() 块中的第二个by() 中使用了您的代码,并在.project("overlapCount", "totalIngredientsCount").by().by() 语句中使用它,以及查询该菜使用的配料总数,然后我可以@987654327 @ 和 .range() 对结果列表进行分页,然后我可以使用一个简单的函数在得到结果后返回比率
    猜你喜欢
    • 2023-01-15
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多