Запрос 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
})
})
Я надеюсь, что кто-то во вселенной найдет это полезным