Следующий обход должен быть эквивалентен:
g.V().hasLabel("ProductCategory").as("pc").
not(__.in().hasLabel("ProductCategory")).
out("HasRootCategory").as("r").
where("pc", eq("r")).
by("Id").
by("RootId").
select("pc")
Поскольку на самом деле вам не нужна метка r
, запрос можно немного изменить:
g.V().hasLabel("ProductCategory").as("pc").
not(__.in().hasLabel("ProductCategory")).
filter(out("HasRootCategory").
where(eq("pc")).
by("Id").
by("RootId"))
Последнее, что следует упомянуть: если вершина ProductCategory
может быть связана с другой вершиной ProductCategory
только одной (или более) определенной меткой ребра, которая может никуда не привести, было бы лучше сделать:
g.V().hasLabel("ProductCategory").as("pc").
not(inE("KnownLabelBetweenCategories")).
filter(out("HasRootCategory").
where(eq("pc")).
by("Id").
by("RootId"))
На другой ноте match()
не считается устаревшим. Я предполагаю, что вы пытались запустить свой обход в Groovy, и он просто не удался, потому что вы не использовали __.as()
(as
, среди прочего, является зарезервированным ключевым словом в Groovy).