Запрос Gremlin Cayley: как сделать многоуровневый запрос

Новичок в cayley и не может понять, как отобразить многоуровневый запрос с неизвестным количеством уровней.

Например, допустим, что все предикаты/отношения между узлами являются «лайками». Если у меня есть график, сформированный таким образом.

A --> B

B --> C

C --> D

D --> E

...

Я хотел бы следить за поездом и отображать весь график лайков. Какой запрос я бы использовал? Это то, что я пробовал.

function getLikes(x) { 
    return g.V(x).As("source").Out("likes").As("target)
}

getLikes("A").ForEach( function(d) {
    g.Emit(getLikes(d))
})

Это только возвращает

{

"результат": [

{

"Все": {},

"А также": {},

"As": {},

"Назад": {},

... И все остальные варианты пути

я тоже пробовал

return g.V(x).As("source").Out("likes").As("target).All()

Вместо второй строки кода. Просто добавил .All() в конце, чтобы завершить запрос. Это возвращает результаты запроса, но инструмент визуализации ничего не показывает. Любое руководство о том, как показать этот график, будет высоко оценено!


person Keeyon Ebrahimi    schedule 08.07.2015    source источник


Ответы (1)


Я не уверен, что вам это все еще нужно, но я все равно напишу, так как мне пришлось узнать то же самое из почти несуществующей документации, основанной на примерах Cayley.

Для перемещения по графу у Кейли есть .FollowRecursive(). метод, определенный в API. Метод .FollowRecursive использует то, что называется Морфизм, чтобы выяснить, как рекурсивно следовать по пути. Насколько я понимаю, это похоже на абстрактный объект пути, который кодирует рекурсивный регистр (что-то вроде вашей функции getLikes (но не совсем)). Вот пример запроса Gizmo, который должен работать для полного обхода графа/цепочки.

var path = g.M().Out("edge_name_here");
var start_node = "begin";

//Path query
//Note that FollowRecursive expects a Morphism path
g.V(start_node).FollowRecursive(path).All() //That's all.

Чтобы визуализировать весь обход или выполнить дополнительные запросы для каждой вершины, используйте конструкцию .ForEach() (см. API).

g.V(start_node).FollowRecursive(path).ForEach( function(v){
  //In here we can do further querying or more vaguely put "stuff"
  g.V(v.id).Out(chain_pred).ForEach( function(t){
    var node = { //This source, target formulation works for visualization for eg.
      source: v.id,
      target: t.id
    }

    g.Emit(node) //This throws the output into the final result bucket
  })
})

Я надеюсь, что кто-то во вселенной найдет это полезным

person Muhammad Ali    schedule 15.06.2017