Janusgraph Gremlin: как определить, имеет ли вершина хотя бы одно отношение / ребро к тысячам вершин с определенным свойством c - PullRequest
0 голосов
/ 05 августа 2020

Допустим, у меня есть эти образцы данных

Vertex[type: Person, name: Foo] ---hasPet---> Vertex[type: Dog, name: Dog1]
Vertex[type: Person, name: Bar] ---hasPet---> Vertex[type: Cat, name: Cat1]
Vertex[type: Person, name: Bazz] ---hasPet---> Vertex[type: Dog, name: Dog2]
Vertex[type: Person, name: Bazz] ---hasPet---> Vertex[type: Dog, name: Dog3]

Затем я хотел найти любую вершину типа Person, у которой есть хотя бы домашнее животное, которым является собака.

Как найти все эти вершины типа Person, не проходя через все вершины типа не человека? совпадений, поскольку Bazz может иметь тысячи других домашних животных.

Мой запрос:

g.traversal().V().has("type", "Person").repeat(out("hasPet").simplePath()).until(has("type", "Dog")).simplePath().in().valueMap("name")

И вот результат:

[Foo]
[Bazz]
[Bazz]

Мне нравится:

[Foo]
[Bazz]

1 Ответ

0 голосов
/ 05 августа 2020

Вы всегда можете использовать шаг dedup для удаления любых повторяющихся результатов:

g.V().has('type', 'Person').
  repeat(out('hasPet').simplePath()).
  until(has('type', 'Dog')).simplePath().in().
  valueMap('name').dedup()

Я не уверен, почему вы не используете разные метки для своих вершин и, по крайней мере, в ваших данных примера шаг repeat и in избыточны. вместо этого вы можете сделать гораздо более простой запрос:

g.V().has('type', 'Person').
  where(out('hasPet').has('type', 'Dog')).
  values('name').dedup()

пример: https://gremlify.com/m33b6dsxnim

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...