[英]Gremlin query to find values of vertices which are common between 2 different vertices
[英]How to write a gremlin query that finds common vertices between other vertices and return sorted by the count of overlap?
我正在使用 python+gremlin 来实现我的图形查询,但还远远没有理解很多概念,并且遇到了一个我不知道该怎么做的有趣查询。
假设我们有许多带有 label Chef
的厨师顶点,带有 label Ingredient
的成分顶点和菜肴顶点Dish
。 在任何给定时间,厨师都可以使用手头的食材,用Chef
和Ingredient
之间的边缘表示has
。 菜肴有配料,用Dish
和Ingredient
之间的边缘表示,称为uses
。 Chef
和Dish
之间还有一条边,表示他/她之前是否做过,称为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 的问题是了解如何将更复杂的查询链接在一起,有没有人可以对如何解决此类问题有所了解?
如果我理解您的描述,您可以执行以下操作:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.