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

Gremlin get all incoming and outgoing vertex, including their edges and directions

我在 Gremlin shell 花了一个星期试图编写一个查询以 获取所有传入和传出的顶点,包括它们的边和方向。我什么都试过了。

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

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

[v{'name':"testname"}]___[ine{edge_name:"nameofincomingedge"}]____[v {姓名:'nameofconnectedvertex']

[v{'name':"testname"}]___[oute{edge_name:"nameofoutgoingedge"}]____[v {姓名:'nameofconnectedvertex']

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

有多种方法可以解决这个问题。这里有一些想法,希望能激发您的答案:

gremlin> g = TinkerGraphFactory.createTinkerGraph()                                                                                                        
==>tinkergraph[vertices:6 edges:6]
gremlin> g.V('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 并在 in/out 边上进行内部遍历。您还可以按如下方式使用 path 来获得类似的输出:

gremlin> g.V('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> g.V().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> g.V().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 应用于每个 [=20] 的每个片段=]:

gremlin> g.V().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]}]