Gremlin - выбор вершин по групповым ключам - PullRequest
3 голосов
/ 13 февраля 2020

У меня есть граф с 2 различными классами вершин с некоторыми идентичными свойствами.

Мне нужно:

  1. сгруппировать все вершины класса Item на основе некоторых свойств
  2. найти вершины класса Product, которые разделяют эти свойства
g.addV("Item").
    property("color", "green").
    property("material", "wood").
    property("shape", "round").
    property("price", 1.2).
  addV("Item").
    property("color", "green").
    property("material", "wood").
    property("shape", "round").
    property("price", .9).
  addV("Item").
    property("color", "green").
    property("material", "wood").
    property("shape", "square").
    property("price", 5).
  addV("Product").
    property("color", "green").
    property("material", "wood").next();

До сих пор я пробовал это

g.V().has("Item", "price", P.inside(0, 10)).
  group().
    by(project("c", "m").
      by("color").by("material")). //\1
    local(unfold().
      project("color", "material","price","product")
        .by(select(Column.keys).select("c"))
        .by(select(Column.keys).select("m"))
        .by(select(Column.values).unfold().values("price").mean())
        .by(
          V().hasLabel("Product"). //\2
          has("material",P.eq(select(Column.keys).select("c"))).fold()));

Я понимаю, что в 2 изменяется область действия, поэтому select(Column.keys) больше не относится к группе. Тем не менее, я в растерянности, как получить значение ключа cm) в обход на 2

1 Ответ

3 голосов
/ 13 февраля 2020

Итак, я попытался решить эту проблему немного по-другому.

В каждой группе будут все элементы и продукты для комбинации цвета и материала

, так что большая часть работы будет сделать на вашем первом group шаге:

g.V().coalesce(
    hasLabel("Item").has("price", P.inside(0, 10)),
    hasLabel("Product").has("color").has("material")
    ).group()
    .by(project("c", "m").by("color").by("material"))
    .unfold()
    .where(select(values).unfold().hasLabel("Item"))
      .project("color", "material","price","product")
        .by(select(keys).select("c"))
        .by(select(keys).select("m"))
        .by(select(values).unfold().hasLabel("Item").values("price").mean())
        .by(select(values).unfold().hasLabel("Product").fold())
...