是否可以使用注入值选择顶点属性?
我无法使用官方文档http://tinkerpop.apache.org/docs/current/reference/#inject-step中提供的lambda,因为我们的案例不支持lambda。
我尝试做
g.inject('vadas').as('a').V().has('name', select('a'))
但是它返回所有具有属性“ name”的顶点,好像它没有选择注入的值
有什么方法可以基于某些注入的值进行“有”过滤吗?
答案 0 :(得分:2)
您的查询应该返回所有具有name
属性的顶点,因为select('a')
应该总是返回一个值。
无法使用注入的值,同时可以从索引查找中受益。您唯一可以做的就是完整的顶点扫描:
gremlin> g.inject('vadas').as('a').V().where(eq('a')).by('name').by()
==>v[2]
这在较小的内存图上很好用,但肯定不是可扩展的解决方案。
更新
如果嵌套的select()
不可用,您仍然可以执行以下操作:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> data = ["marko": ["title": "dr", "age": 40]]
==>marko={title=dr, age=40}
gremlin> g.V().has("person","name",within(data.keySet())).as("v").
flatMap(constant(data).unfold().
where(eq("v")).
by(keys).
by("name").
select(values).
unfold()).as("kv").
select("v").
property(select("kv").by(keys), select("kv").by(values)).
iterate()
gremlin>
gremlin> g.V().valueMap()
==>[name:[marko],title:[dr],age:[40]]
...
此遍历有一个完整的扫描,但仅在data
内存结构上进行。因此,如果data
并不大,则遍历性能应该/可以接受。
答案 1 :(得分:0)
@Daniel Kuppitz和@Huimin Yang,我们已经支持此功能,使用属性索引扫描,我认为它将提供有用的功能
gremlin> g.inject('vadas').as('a').V().has('name', eq(select('a'))).profile()
==>Traversal Metrics
Step Count Traversers Time (ms) % Dur
=============================================================================================================
InjectStep([vadas])@[a] 1 1 0.090 0.51
GraphDbGraphStep(vertex,[name.eq([SelectOneStep... 1 1 17.768 99.49
>TOTAL - - 17.859 -
gremlin> g.inject('vadas').as('a').V().has('name', eq(select('a')))
==>v[vadas]