гремлин где оговорка со свойством и суммой обхода - PullRequest
0 голосов
/ 27 сентября 2018

пример графика:

g.addV('location').property('name','Location A').as('location')
.addV('building').property('totalLetterCapacity',50).as('building')
.sideEffect(addE('has-building').from('location'))
.addV('letter').property('totalLetters',10).as('a')
.sideEffect(addE('has-letter').from('building'))
.addV('letter').property('totalLetters',10).as('b')
.sideEffect(addE('has-letter').from('building'))
.addV('letter').property('totalLetters',10).as('c')
.sideEffect(addE('has-letter').from('building'))
.addV('letter').property('totalLetters',10).as('d')
.sideEffect(addE('has-letter').from('building'))
.addV('letter').property('totalLetters',10).as('e')
.sideEffect(addE('has-letter').from('building'))

В этом примере графика я хочу получить все здания, которые заполнены буквами.Таким образом, в этом образце графика есть только одно местоположение, которое удовлетворяет требованию - имеет 50 буквенных емкостей и 5 букв с 10 емкостями, прикрепленными к зданию.

Я надеялся, что что-то подобное сработает:

g.V().hasLabel('location')
 .out('has-building')
 .where(values('totalLetterCapacity')
       .is(eq(out('has-letter').values('totalLetters').sum())

но похоже, что предикат eq или любой из предикатов (lte, lt, gte) не допускают обходов.Я попытался сделать что-то вроде двойного выражения «где» - «где - то где», но в итоге получилось немного сумасшедшим.

Я использую лазурный космос, db gremlin.Как правильно использовать свойство в обходе в качестве сравнения суммы?

1 Ответ

0 голосов
/ 27 сентября 2018

P.eq() - это тест на равенство, поэтому что-то вроде этого:

values('totalLetterCapacity').is(eq(out('has-letter').values('totalLetters').sum())

говорит, что вы хотите сравнить числовое значение в "totalLetterCapacity" с анонимным Traversal (не результаттот Traversal), который, очевидно, false.

Подход к решению этого вопроса, который сразу запал мне в голову, заключался в следующем:

gremlin> g.V().hasLabel('location').
......1>   out('has-building').as('a').
......2>   where('a', eq('a')).
......3>     by('totalLetterCapacity').
......4>     by(out('has-letter').values('totalLetters').sum())
==>v[2]

Выше where() сравнивает вершину, обозначенную "a", с вершиной, отмеченной "a""с P.eq(), но значение, назначенное в этом сравнении, определяется прилагаемыми модуляторами by().Первое «a» - это «totalLetterCapacity», а второе «a» - это sum() из «totalLetters» в вершинах «буквы».

...