在我的小精灵查询中,我有以下内容:
vert.as('x').
both.or(
_().has("time").filter{ it.time.toInteger() > startTime.toInteger() },
_().has("isRead"), _().has("isWrite")).dedup().gather.scatter.
store(y).loop('x'){c++ < limit.toInteger()}.iterate();
在我的 gremlin 脚本中,我返回 y,但 y 显然只有顶点。我可以通过为每个顶点迭代它们来手动检索每个边,但是我想要一个返回的列表,其中只包含在列表 y 中返回的其他节点之间的边。
特别是,我需要能够在本地重新创建在数据结构中返回的子图,因此 gremlin 被用于返回该信息。关于我的用例影响这些需求的其他细节是,手动迭代每个节点边缘太慢,因为我正在运行我的灯泡脚本的 rexster 服务器必须通过网络推送数据,而且还因为如果我没有使用脚本最初返回的每个顶点之间的边集,那么我必须检查沿每条边遇到的每个顶点,以确保它在最初返回的集合内;非常不理想。
基本上,任何结果都应该是这样的,当我查看任何返回的顶点时,我可以知道返回集合中链接了哪些顶点——而无需进行任何手动检查或查找。它应该只在数据集中。
编辑1:
我发现 gremlin 的树管道功能非常适合做我想做的事!问题是,既然我使用了树,我需要将它返回到可以使用的形式......我只能返回顶点或边,所以我不能立即返回树。
编辑2:
espeed 是对的;我应该使用bothE 开始。但是我有一些我想满足的条件......我几乎早先拥有它,但我无法让过滤器正常工作。
vert.as('l').
bothE.gather.scatter.as('edge').bothV.or(
_().has("time").filter{ it.getProperty('time').toInteger() >= startTime.toInteger() },
_().has("isRead"), _().has("isWrite")).
dedup().store(results).as('vertice').back('edge').store(results).back('vertice')
.loop('l'){c++ < limit.toInteger()}.iterate();
我不明白为什么我不能在一个管道中使用两个后端(我得到一个 NullPointerException)。我要解决的基本问题是:进行广度优先搜索,只存储满足以上所有条件的节点,并存储所有通过测试的顶点之间的边。