从gremlin查询中的值列表中过滤节点

时间:2018-06-08 16:50:04

标签: gremlin titan

假设我有一个属性值列表作为ArrayList,我如何按列表中的值过滤节点。

这样的事情可能......

g.V().filter {it.get().value("name") in list}

它也与TinkerPop 2.x兼容

2 个答案:

答案 0 :(得分:5)

您可以简单地使用has步骤进行过滤,因为within谓词可以获取值列表:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> names=['josh','peter']; g.V().has('name', within(names))
==>v[4]
==>v[6]

编辑:我的回答并没有真正解决这个问题,因为它现在要求提供TinkerPop 2解决方案。我仍然留在这里以防万一有人在寻找TinkerPop 3的解决方案时偶然发现这个问题。

答案 1 :(得分:3)

使用filter()步骤可以起作用:

gremlin> [ 'Titan' : Titan.version(), 'TinkerPop' : Gremlin.version()]
==>Titan=0.5.4
==>TinkerPop=2.5.0
gremlin> g = TitanFactory.open('inmemory')
==>titangraph[inmemory:[127.0.0.1]]
gremlin> v0 = g.addVertex().setProperty('name', 'amith')
==>null
gremlin> v1 = g.addVertex().setProperty('name', 'jason')
==>null
gremlin> v2 = g.addVertex().setProperty('name', 'stephen')
==>null
gremlin> g.commit()
==>null
gremlin> l = ['amith', 'jason', 'florian'] // list to match
==>amith
==>jason
==>florian
gremlin> g.V().filter{ l.contains(it.getProperty('name')) }.map()
15:06:30 WARN  com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx  - Query requires iterating over all vertices [()]. For better performance, use indexes
==>{name=amith}
==>{name=jason}

请记住,Titan 0.5.4已过时(2015年2月发布),它取决于TinkerPop 2。5。0(2014年4月发布)。泰坦和TinkerPop 2.x不再处于积极发展阶段。

你应该考虑继续前进到JanusGraph,它是Titan的一个分支,拥有一个活跃开放的社区,并且与最新版本的Apache TinkerPop 3.x保持同步。