У меня проблема при попытке фильтрации на основе сохраненного списка строк.Я хочу построить этот список в sideEffect()
, а затем использовать его в последующем where(without())
.Я ожидаю список пользователей, исключая user.a1
в следующем примере, но user.a1
включен.
g.V().hasLabel('user').sideEffect(hasId('user.a1').id().store('exclude')).where(id().is(without('exclude')))
[
{
"id": "user.a1",
"label": "user",
"type": "vertex"
},
{
"id": "user.b1",
"label": "user",
"type": "vertex"
},
...
]
Я предполагаю, что это происходит, потому что Gremlin проверяет литеральную строку exclude
Так как же заставить его сверяться с идентификаторами, хранящимися в переменной exclude
?
Например, это работает:
g.V().hasLabel('user').sideEffect(hasId('user.a1').id().store('exclude')).where(id().is(without('user.a1')))
[
{
"id": "user.b1",
"label": "user",
"type": "vertex"
},
...
]
РЕДАКТИРОВАТЬ # 1
Попробовал запросы, предложенные Стивеном Маллеттом , но все еще не получил именно то, что я ищу (может быть, это невозможно на CosmosDB?).
Прежде всегопо-видимому, filter
недоступна на CosmosDB:
g.V().hasLabel('user').
sideEffect(hasId('user.a1').id().store('exclude')).
filter(id().where(without('exclude')))
ExceptionType : GraphCompileException
ExceptionMessage : Gremlin Query Compilation
Error: Unable to find any method 'filter' @ line 1, column 81. 1
Error(s) Source : Microsoft.Azure.Graphs
Второе предложение привело к пустому набору, а второе сработало:
g.V().hasLabel('user').hasId('user.a1').
aggregate('exclude').where(without('exclude'))
[]
g.V().hasLabel('user').
sideEffect(hasId('user.a1').aggregate('exclude')).
where(without('exclude'))
[
{
"id": "user.b1",
"label": "user",
"type": "vertex"
},
{
"id": "user.b2",
"label": "user",
"type": "vertex"
},
...
]
Проблема в том, чтоЯ хочу фильтровать края, используя значения их свойств.Моя реальная ситуация такова, что я хочу объединить следующие два запроса в один, если это возможно: получить набор role
идентификаторов вершин, а затем получить пользователей, которые выполняют одну из ролей и принадлежат к подгруппе групп.(Пользователи принадлежат группе с идентификатором роли в этой группе, заданным как свойство user-> group belongs_to
edge.)
- Получение набора ролей из иерархии ролей (
role.2
+ все родители)
g.V('role.2').store('roles').
repeat(__.out('is_under')).emit().store('roles').
select('roles').unfold().dedup().id()
[
"role.2",
"role.1"
]
Получить пользователей с указанными выше ролями в группе B или выше и дать им преимущество в другой роли.
g.V('group.B').
sideEffect(inE('belongs_to').
has('role',within('role.1','role.2')).outV().store('users')).
repeat(__.out('belongs_to')).emit().inE('belongs_to').
has('role',within('role.1','role.2')).outV().store('users').
select('users').unfold().addE('has').to(g.V('role.12'))