使用注入的 has('prop', 'value') 选择顶点时 'value'
when selecting vertex using has('prop', 'value') with injected 'value'
是否可以使用注入值 select 顶点属性?
我无法使用官方文档中提供的 lambda:http://tinkerpop.apache.org/docs/current/reference/#inject-step 因为在我们的案例中不支持 lambda。
我试过
g.inject('vadas').as('a').V().has('name', select('a'))
但它返回所有具有属性 'name' 的顶点,似乎它不是 select 注入的值
有什么方法可以根据某些注入值执行 'has' 过滤器吗?
您的查询应该 return 所有具有 name
属性 的顶点,因为 select('a')
应该总是 return 一个值。
无法在使用注入值的同时受益于索引查找。你唯一能做的就是全顶点扫描:
gremlin> g.inject('vadas').as('a').V().where(eq('a')).by('name').by()
==>v[2]
这在小型 in-memory 图上效果很好,但它肯定不是一个可扩展的解决方案。
更新
如果嵌套 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
不是很大,遍历性能 should/could 是可以接受的。
@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]
是否可以使用注入值 select 顶点属性?
我无法使用官方文档中提供的 lambda:http://tinkerpop.apache.org/docs/current/reference/#inject-step 因为在我们的案例中不支持 lambda。
我试过
g.inject('vadas').as('a').V().has('name', select('a'))
但它返回所有具有属性 'name' 的顶点,似乎它不是 select 注入的值
有什么方法可以根据某些注入值执行 'has' 过滤器吗?
您的查询应该 return 所有具有 name
属性 的顶点,因为 select('a')
应该总是 return 一个值。
无法在使用注入值的同时受益于索引查找。你唯一能做的就是全顶点扫描:
gremlin> g.inject('vadas').as('a').V().where(eq('a')).by('name').by()
==>v[2]
这在小型 in-memory 图上效果很好,但它肯定不是一个可扩展的解决方案。
更新
如果嵌套 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
不是很大,遍历性能 should/could 是可以接受的。
@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]