Запрос 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))
})

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

{

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

{

"Все": {},

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

"Как": {},

"Назад": {},

... и все другие варианты пути

Я также пытался

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

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

1 ответ

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

Для обхода графа у Кейли есть метод .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
  })
})

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

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