问题描述
所以我使用查询
graph.traversal().V().hasLabel("test").or(
__.out("membership").hasLabel("location"),__.out("composition").hasLabel("aws_vpc"))
选择它,但是如何打印所有元素的名称, 我想输出:测试,成员资格,位置,组成,aws_vpc。
有没有办法做到这一点?
解决方法
您已编写了一个遍历,该遍历仅检测“测试”顶点是否具有与相邻“位置”顶点相邻的传出“成员资格”边缘或与相邻“ aws_vpc”顶点相邻的传出“组成”边缘,因此所有遍历都将返回是与该过滤器匹配的“测试”顶点。除此之外,它不会“选择”任何东西。实际上,一旦按提供给or()
的顺序返回了单个__.out("membership").hasLabel("location")
或__.out("composition").hasLabel("aws_vpc")
,就会立即满足or()
的需求,因此您甚至不必遍历所有对象这些路径(对于过滤操作来说是一件好事)。
如果要返回描述的所有数据,则需要编写查询以遍历所有查询并将其转换为返回格式。在您的情况下,执行此操作的一种简单方法是使用project()
:
g.V().hasLabel('test').
project('data','memberships','compositions').
by(__.elementMap()).
by(__.outE("membership").as('e').
inV().hasLabel("location").as('v').
select('e','v').
by(elementMap()).
fold()).
by(__.outE("composition").as('e').
inV().hasLabel("aws_vpc").as('v').
select('e','v').
by(elementMap()).
fold())
这将获取每个“测试”顶点,并使用三个键将其转换为Map
:“数据”,“成员资格”和“竞争”,然后每个by()
调制器都指定如何处理当前的“测试”顶点将被转换并将其放置在相应的键中。请注意,我选择了select()
来获取边线和顶点组合,但是如果您愿意的话,也可能是project()
的一步。密钥以fold()
结尾,以便将每个“测试”顶点的边缘数据流减少为List
个数据,这些数据可以放入相关的“成员身份”和“组成”密钥中