База данных графа обхода из случайных исходных узлов

Мне поручили написать запрос для внешнего приложения, визуализирующего базу данных Neptune Graph. Допустим, первая вершина - это элементы, а вторая вершина - пользователь. Пользователь может создать элемент. Существуют отношения между элементами для отображения элементов, полученных из другого элемента, например, в случае медиаклипов, вырезанных из исходного медиаклипа. Первый набор созданных элементов должен быть создан в вершине, такой как SERVER, по которой они сгруппированы в пользовательском интерфейсе.

Следующее требование:

    Find (Y) seed nodes that are not connected by any ITEM-ITEM relationships on the graph (relationships via USERs etc... are fine)
    Populate the graph with all relationships from these (Y) seed nodes with no limits on the relationships that are followed (relationships through USERs for example is fine).
    Stop populating the graph once the number of nodes (not records limit) hits the limit specified by (X)

Вот визуальное представление графика.

https://drive.google.com/file/d/1YNzh4wbzcdC0JeloMgD2C0oS6MYvfI4q/view?usp=sharing

Ниже приведен пример кода для воспроизведения этого графика. Этот график может стать еще глубже. Это просто простой пример. Пожалуйста, смотрите схему:

g.addV('SERVER').property(id, 'server1')
g.addV('SERVER').property(id, 'server2')
g.addV('ITEM').property(id, 'item1')
g.addV('ITEM').property(id, 'item2')
g.addV('ITEM').property(id, 'item3')
g.addV('ITEM').property(id, 'item4')
g.addV('ITEM').property(id, 'item5')
g.addV('USER').property(id, 'user1')


g.V('item1').addE('STORED IN').to(g.V('server1'))
g.V('item2').addE('STORED IN').to(g.V('server2'))
g.V('item2').addE('RELATED TO').to(g.V('item1'))
g.V('item3').addE('DERIVED FROM').to(g.V('item2') )
g.V('item3').addE('CREATED BY').to(g.V('user1'))
g.V('user1').addE('CREATED').to(g.V('item4'))
g.V('item4').addE('RELATED TO').to(g.V('item5'))

Результат должен быть в форме ниже, если это возможно:

[
 [
   {
     "V1": {},
     "E": {},
     "V2": {}
   }
 ]
]

У нас есть API с конечной точкой, которая позволяет выполнять открытые запросы гремлина. Мы вызываем эту конечную точку в нашем клиентском приложении, чтобы получать данные, отображаемые визуально. Я написал запрос, который я считаю не совсем правильным. Кроме того, я хотел бы знать, как отфильтровать количество пройденных узлов и остановиться на X узлах.

g.V().hasLabel('USER','SERVER').sample(5).aggregate('v1').repeat(__.as('V1').bothE().dedup().as('E').otherV().hasLabel('USER','SERVER').as('V2').aggregate('x').by(select('V1', 'E', 'V2'))).until(out().count().is(0)).as('V1').bothE().dedup().as('E').otherV().hasLabel(without('ITEM')).as('V2').aggregate('x').by(select('V1', 'E', 'V2')).cap('v1','x','v1').coalesce(select('x').unfold(),select('v1').unfold().project('V1'))

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

@daniel-kuppitz, не могли бы вы помочь с этим. Я также очень ценю вариант запроса, который также ограничивает количество записей. Большое тебе спасибо.

sage 29.07.2019 01:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я снова посмотрел на это и придумал этот запрос

g.V().hasLabel(without('ITEM')).sample(2).aggregate('v1').
  repeat(__.as('V1').bothE().dedup().as('E').otherV().as('V2').
      aggregate('x').by(select('V1', 'E', 'V2'))).
    until(out().count().is(0)).
  as('V1').bothE().dedup().as('E').otherV().as('V2').
  aggregate('x').
    by(select('V1', 'E', 'V2')).
  cap('v1','x','v1').
  coalesce(select('x').unfold(),select('v1').unfold().project('V1')).limit(5)

Чтобы соответствовать критериям количества узлов, а не количества записей (или ограничения), я могу перейти к ограничению половины числа, переданного пользователем в качестве входных данных для подсчета узлов, а затем исключить ребро E и вершину V2 последней записи из что будет отображаться в пользовательском интерфейсе.

Я подойду к любым предложениям на лучший путь.

@ daniel-kuppitz, не могли бы вы внести какие-либо предложения или предложения относительно решения, описанного выше? Большое тебе спасибо.

sage 01.08.2019 07:01

Другие вопросы по теме