使用has('prop','value')和注入的'value'选择顶点时

时间:2019-05-16 23:39:06

标签: graph-databases gremlin tinkerpop

是否可以使用注入值选择顶点属性?

我无法使用官方文档http://tinkerpop.apache.org/docs/current/reference/#inject-step中提供的lambda,因为我们的案例不支持lambda。

我尝试做

g.inject('vadas').as('a').V().has('name', select('a'))

但是它返回所有具有属性“ name”的顶点,好像它没有选择注入的值

有什么方法可以基于某些注入的值进行“有”过滤吗?

2 个答案:

答案 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]