Гремлин: Какой самый эффективный способ написать несколько обходов?

Предположим, у меня есть вершинный человек, и у него несколько ребер, я хочу проецировать свойства из всех обходов. Каков наиболее эффективный способ написать запрос в Cosmos DB Gremlin API?

Я пробовал следующее, но оно работает медленно.

g.V().
hasLabel('person').
project('Name', 'Language', 'Address').
by('name').
by(out('speaks').values('language')).
by(out('residesAt').values('city'))

Кроме того, у меня есть несколько фильтров и сортировка для каждого обхода.


person Kajal Patel    schedule 24.06.2020    source источник


Ответы (1)


Я не думаю, что вы можете написать этот конкретный обход, поскольку вы показали его более эффективно, чем он уже написан, особенно если вы добавили фильтры к обходам out('speaks') и out('residesAt'), чтобы еще больше ограничить эти пути, и в том виде, в каком он есть в вашем Например, вы возвращаете только первый найденный язык или город, что, очевидно, быстрее, чем прохождение всех этих возможных путей.

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

person stephen mallette    schedule 24.06.2020