Нужна помощь в преобразовании скрипта Neo4j Cypher в Gremlin - PullRequest
0 голосов
/ 30 мая 2019

Я не могу понять, как переписать мой скрипт Cypher в Gremlin.

Сначала мы использовали клиент .Net Neo4j для подключения к нашей базе данных Neo4j и запуска запросов Cypher к ней.Затем мы решили добавить слой абстракции и подключиться к серверу Gremlin (на котором сейчас размещена та же база данных Neo4j).Так что теперь мне нужно перевести наши запросы с Сайфера на Гремлин, и я нахожу это довольно трудным.

Вот один из них:

MATCH (pc:ProductCategory)-[:HasRootCategory]->(r:RootCategory)
WHERE NOT (:ProductCategory)-[]->(pc) 
AND pc.Id = r.RootId 
RETURN pc;

Одна из моих неудачных попыток: g.V().match(as("pc").out("HasRootCategory").as("r"),as("pc").in().has('label', 'ProductCategory').count().is(0))).select("pc", "r").where("pc.Id", eq("r.RootId")).select("pc")

Я нашел пример стекопотока, используя эту конструкцию 'match (as',но это должно быть искажено или что-то в этом роде, потому что я получаю сообщение об ошибке. Кроме того, я не уверен, как сравнивать свойства с разными именами на узлах с разными метками (я уверен, что «где» неверно ...)

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 30 мая 2019

Следующий обход должен быть эквивалентен:

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).

...