在 tinkerpop gremlin 中,如何搜索 属性 值是参数子集的顶点?

In tinkerpop gremlin, how do I search for Vertices where a property value is a subset of an argument?

我有一个图,其中的顶点有一个 属性 “foo”,它是一个集合。我想找到所有“foo”是我输入的子集的顶点。例如,

g.addV('v').property('foo', 'bar').property('foo','baz')

我想查询此图,如果给定 ["bar, "quux", "quuz"] 的输入,我将找不到符合条件的顶点,因为顶点 属性 不是 ["bar, "quux", "quuz"][ 的子集=17=]

如果我得到 ["bar", "quux, "quuz", "baz"] 的输入,那么这个顶点将被返回,因为 ["bar", "baz"]["bar", "quux, "quuz", "baz"]

的子集

这种集合交集很棘手,因为 Gremlin 语言不像 Groovy 那样具有 containsAll 类型的方法。如果您能够在查询中包含 Groovy 闭包(并非所有实现都允许它们),一种方法如下:

gremlin> g.addV('v').property('foo', 'bar').property('foo','baz')
==>v[61286]  

gremlin>  g.V().hasLabel('v').
......1>        filter {["bar", "quux", "quuz", "baz"].
......2>                containsAll(it.get().values('foo').
......3>                collect())}  
==>v[61286]  

gremlin> g.V().hasLabel('v').property(set,'foo','abc')
==>v[61286]

gremlin> g.V().hasLabel('v').valueMap()
==>[foo:[bar,baz,abc]]

gremlin>  g.V().hasLabel('v').
......1>        filter {["bar", "quux", "quuz", "baz"].
......2>                containsAll(it.get().values('foo').
......3>                collect())}  
gremlin>   

通常不建议使用闭包,因为并非所有实现都允许闭包,而且闭包不太可能利用后端优化和索引。