Groovy 如何在执行广度优先搜索时在Gremlin中包含边?

Groovy 如何在执行广度优先搜索时在Gremlin中包含边?,groovy,gremlin,bulbs,rexster,Groovy,Gremlin,Bulbs,Rexster,在我的gremlin查询中,我有以下内容: 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(); vert.

在我的gremlin查询中,我有以下内容:

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();
vert.as('x')。
两者都有(
_().has(“time”).filter{it.time.toInteger()>startTime.toInteger()},
_().has(“isRead”)、().has(“isWrite”).dedup().gather.scatter。
store(y).loop('x'){c++
在我的小精灵脚本中,我返回y,但y中显然只有顶点。我可以通过对每个顶点进行迭代来手动检索每个边,但我希望返回的列表只包含列表y中返回的其他节点之间的边

特别是,我需要能够在本地重新创建在数据结构中返回的子图,因此使用gremlin返回该信息。影响这些需求的关于我的用例的其他细节是,手动迭代每个节点边缘的速度太慢,因为我运行Bulls脚本的rexster服务器必须将数据推送到网络上,还有一个原因是,如果我没有使用脚本最初返回的每个顶点之间的边集,那么我必须检查每个边上遇到的每个顶点,以确保它在最初返回的集中;非常不理想

基本上,任何结果都应该是这样的,当我查看任何返回的顶点时,我可以知道返回集中链接了哪些顶点,而无需进行任何手动检查或查找。它应该只在数据集中

编辑1:

我发现gremlin的树管道功能非常适合做我想做的事情!问题是,现在我使用tree,我需要将它返回到一个可以使用的表单。。。我只能返回顶点或边,所以不能直接返回树

编辑2:

埃斯皮德是对的;我应该从这两个开始。但我有一些条件,我想满足。。。我几乎早就有了,但我无法让过滤器正常工作

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();
vert.as('l')。
两个。聚集。分散。作为('edge')。两个(
_().has(“time”).filter{it.getProperty(“time”).toInteger()>=startTime.toInteger()},
_().has(“isRead”),().has(“isWrite”))。
重复数据消除().store(results).as('vertice').back('edge').store(results).back('vertice'))
.loop('l'){c++
我不明白为什么我不能在一个管道中使用两个back(我得到了一个NullPointerException)。我想解决的基本问题是:进行广度优先搜索,只存储满足以上所有条件的节点,并存储通过测试的所有顶点之间的边。

使用
bothE()
而不是
bother()
访问边


请参见,不要过多地修改代码,也许最简单的方法是:

results = [] as Set
vert.as('l').
bothE.as('e').gather.scatter.as('edge').bothV.or(
  _().has("time").filter{ it.getProperty('time').toInteger() >= startTime.toInteger()}.store(results),
  _().has("isRead"), _().has("isWrite")).store(results))
.sideEffect{e,m->results<<m.e}
.loop('l'){c++ < limit.toInteger()}.iterate();
results=[]设置为
垂直于('l')。
两个都是。作为('e')。聚集。分散。作为('edge')。两个都是(
_().has(“time”).filter{it.getProperty(“time”).toInteger()>=startTime.toInteger()}.store(结果),
_().has(“isRead”),().has(“isWrite”).store(结果))

.sideEffect{e,m->results再次感谢您,espeed。这与我想要做的非常接近,我想我在一遍又一遍地编辑代码时做过类似的事情;问题是,当您执行back('edge')时然后,它将结果从edge转发到store,但store也只是将其传递。当loop获取当前元素值时,它是edge,在as('l')处,它应该是vertice,以便两者都能解析。这就是为什么我必须“备份”那里的片段,但它总是抛出NullPointerException…移动为('l'))不过,around并不能解决这个问题;我认为唯一需要发生的事情是存储在has(“isWrite”)中的vertice。存储(结果)需要是发送回as(“l”)的vertice…我去掉了它,然后"通过命名边缘步骤并从一个
副作用引用它来作弊,
…这行得通吗?只是想让你得到一个答案,这样你就可以从那里迭代…也许这不是最好的方法。这看起来是正确的,非常感谢,我不知道怎么做,我甚至已经研究过了,但我不熟悉Groovy。虽然它没错,当我运行它时,即使我增加了限制,它似乎也不会添加更多的结果…我会检查一下,并找出原因,它可能是我的数据…使用Gremlin REPL编辑/调试Gremlin脚本(Rexster不适用于此)。理想情况下,您应该像测试Python脚本一样创建/测试一个Gremlin脚本--为代码创建一个Gremlin Groovy文件并运行Groovy测试--此流程要简单得多。然后,一旦您的Gremlin脚本正常工作,将其添加到脚本中。