У меня есть граф, состоящий из 4 типов узлов и 4 типов ребер, как показано ниже.
(c)-[affecting]->(p)
(c)-[found_in_release]->(r)
(p)-[found_in_release]->(r)
(s)-[severity]->(c)
Сначала я написал свои запросы (в декларативной форме), используя Match()
, и протестировал их с помощью консоли Gremlin.
К моему удивлению, я обнаружил, что Cosmos Gremlin API не поддерживает шаг Match()
, и теперь мне нужно преобразовать декларативный запрос match()
ниже в его императивный аналог.
g.V().match(
__.as('c').out('affecting').as('p'), \
__.as('c').out('cve_found_in_release').as('r'), \
__.as('p').out('pack_found_in_release').as('r'), \
__.as('s').both('severity').as('c') \
). \
select('c', 'p', 'r', 's').limit(10)
Я подумал, что могу преобразовать match()
шаг в 2 traversals
, как показано ниже:
# (c)-[affecting]->(p)-[pack_found_in_release]->(r)
"g.V().hasLabel('cve').as('c').out('affecting').as('p').out('pack_found_in_release').as('r').select('c', 'p', 'r')
# (s)-[severity]->(c)
"g.V().hasLabel('cve').as('s').out('severity').as('r').select('s' 'r')
А затем объединить результаты этих двух запросов.
Однако мне интересно, есть ли лучший способ выполнить запрос на сопоставление с образцом таким образом, который поддерживается Cosmos API (в основном без шага сопоставления) Любое понимание будет оценено
Если я хорошо понимаю ваш вариант использования, вы ищете подграфы, в которых CVE связан с серьезностью, с пакетом и с выпуском. Gremlin — довольно богатый язык, поэтому я думаю, что будет несколько способов сделать это. Первый, который сработал у меня, приведен ниже, с использованием Графика Богов ЯнусаГрафа.
graph = JanusGraphFactory.open('conf/janusgraph-inmemory.properties')
GraphOfTheGodsFactory.loadWithoutMixedIndex(graph,true)
g = graph.traversal()
g.V().as('v').and(
__.out('lives'),
__.out('pet'),
__.out('brother')
).project('v', 'l', 'p', 'b').
by(values('name')).
by(out('lives').values('name')).
by(out('pet').values('name')).
by(out('brother').values('name'))
12:15:11 WARN org.janusgraph.graphdb.transaction.StandardJanusGraphTx - Query requires iterating over all vertices [()]. For better performance, use indexes
==>[v:pluto,l:tartarus,p:cerberus,b:jupiter]
Шаг and() выполняет выбор подграфа, что необходимо, если ваш граф имеет CVE, которые не составляют полный подграф. Шаг project() собирает необходимые информационные элементы для каждого подграфа CVE.
Используя эти шаблоны, вы можете добавить дополнительное условие, что CVE и пакет относятся к одному и тому же выпуску, если это необходимо.
Спасибо @HadoopMarc. У меня есть связанный с этим вопрос. Не могли бы вы попробовать ответить и на него? stackoverflow.com/questions/74187885/…