Gremlin获取所有传入和传出的顶点,包括它们的边缘和方向

我花了一个星期在Gremlin shell尝试编写一个查询来获取所有传入和传出的顶点,包括它们的边缘和方向。 我尝试了一切。

gV("name","testname").bothE.as('both').select().back('both').bothV.as('bothV').select(){it.map()} 

我需要的输出是(只是示例结构):

[V { ‘名称’: “测试名”}] ___ [啉{edge_name: “nameofincomingedge”}] ____ [V {名称: ‘nameofconnectedvertex’]

[V { ‘名称’: “测试名”}] ___ [欧特{edge_name: “nameofoutgoingedge”}] ____ [V {名称: ‘nameofconnectedvertex’]

所以我只想获得1)具有确切名称的所有顶点,每个顶点的边缘(包括inE或outE类型)和连接的Vertex。 理想情况下,我想得到他们的map()所以我得到完整的对象属性。 我不关心输出风格,我只需要所有信息,所以我可以用它来操纵它。 我需要这个训练我的Gremlin,但欢迎Neo4j的例子。 谢谢!

有很多方法可以解决这个问题。 这里有一些想法可以激发你的答案:

 gremlin> g = TinkerGraphFactory.createTinkerGraph() ==>tinkergraph[vertices:6 edges:6] gremlin> gV('name','marko').transform{[v:it,inE:it.inE().as('e').outV().as('v').select().toList(),outE:it.outE().as('e').inV().as('v').select().toList()]} ==>{v=v[1], inE=[], outE=[[e:e[9][1-created->3], v:v[3]], [e:e[7][1-knows->2], v:v[2]], [e:e[8][1-knows->4], v:v[4]]]} 

transform将传入的顶点转换为Map ,并在输入/输出边缘进行内部遍历。 您还可以使用如下path获取类似的输出:

 gremlin> gV('name','marko').transform{[v:it,inE:it.inE().outV().path().toList().toList(),outE:it.outE().inV().path().toList()]} ==>{v=v[1], inE=[], outE=[[v[1], e[9][1-created->3], v[3]], [v[1], e[7][1-knows->2], v[2]], [v[1], e[8][1-knows->4], v[4]]]} 

我使用TinkerPop 2.x提供了这些答案,因为从语法判断看起来就像你使用的那样。 TinkerPop 3.x现已上市,如果您刚入门,您应该看一下最新提供的产品:

http://tinkerpop.incubator.apache.org/

在3.0语法下你可能会这样做:

 gremlin> gV().has('name','marko').as('a').bothE().bothV().where(neq('a')).path() ==>[v[1], e[9][1-created->3], v[3]] ==>[v[1], e[7][1-knows->2], v[2]] ==>[v[1], e[8][1-knows->4], v[4]] 

我知道你想知道输出中边缘的方向,但是在分析路径时很容易检测到。

更新:以上是使用Daniel建议使用otherV的上述查询:

 gremlin> gV().has('name','marko').bothE().otherV().path() ==>[v[1], e[9][1-created->3], v[3]] ==>[v[1], e[7][1-knows->2], v[2]] ==>[v[1], e[8][1-knows->4], v[4]] 

要查看此数据,您可以使用by()来分隔每个Path对象 – 上述查询的扩展将valueMap应用于每个Path每个部分:

 gremlin> gV().has('name','marko').bothE().otherV().path().by(__.valueMap(true)) ==>[{label=person, name=[marko], id=1, age=[29]}, {label=created, weight=0.4, id=9}, {label=software, name=[lop], id=3, lang=[java]}] ==>[{label=person, name=[marko], id=1, age=[29]}, {label=knows, weight=0.5, id=7}, {label=person, name=[vadas], id=2, age=[27]}] ==>[{label=person, name=[marko], id=1, age=[29]}, {label=knows, weight=1.0, id=8}, {label=person, name=[josh], id=4, age=[32]}]