Мне поручили написать запрос для внешнего приложения, визуализирующего базу данных 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'))
Я был бы признателен, если бы я мог получить один запрос, который будет извлекать этот набор данных, если это возможно. Если вершины в результате ни с чем не связаны, я хотел бы получить их и отобразить в пользовательском интерфейсе.
Я снова посмотрел на это и придумал этот запрос
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, не могли бы вы внести какие-либо предложения или предложения относительно решения, описанного выше? Большое тебе спасибо.
@daniel-kuppitz, не могли бы вы помочь с этим. Я также очень ценю вариант запроса, который также ограничивает количество записей. Большое тебе спасибо.