尝试根据存储的字符串列表进行过滤时遇到问题。我想在 a 中构建这个列表,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 正在检查文字 string exclude
,那么我如何让它检查存储在exclude
变量中的 ID 呢?
例如,这有效:
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
尝试了stephen mallette建议的查询,但仍然没有得到我正在寻找的内容(也许在 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
顶点 ID,然后获取拥有其中一个角色并属于组子集的用户。(用户属于一个组,其角色 ID 在该组中设置为 user->groupbelongs_to
边缘的属性。)
- 从角色层次结构中获取一组角色(
role.2
+所有父母)
g.V('role.2').store('roles').
repeat(__.out('is_under')).emit().store('roles').
select('roles').unfold().dedup().id()
[
"role.2",
"role.1"
]
- 在 group.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'))