我正在用python+gremlin实现我的图查询,但对很多概念还是远远没有理解,遇到一个有趣的查询不知道怎么做。
比如说我们有一些厨师顶点,标签是 Chef
,带标签的原料顶点 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)