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

标签 java graph neo4j titan gremlin

我在 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{name:'nameofconnectedvertex']

[v{'name':"testname"}]___[oute{edge_name:"nameofoutgoingedge"}]____[v{name:'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 并对输入/输出边进行内部遍历。您还可以按如下方式使用 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 到每个 Path 的每一部分:

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]}]

关于java - Gremlin 获取所有传入和传出的顶点,包括它们的边和方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33676566/

相关文章:

python - .pop() 似乎在 Python 中触发了 TypeError,即使结果应该是一个列表

java - Mac 上的 Neo4j : Prevent org. neo4j.server.Bootstrapper 出现在 dock 中

java - 在Java中使用FFMPEG(在Mac上开发)

java - Spring JMS 模板 - 并发调用

algorithm - METIS 串行图分区器

python pandas 时间线图

dynamic - Neo4j 查询标签集中的节点集并对每种类型的节点动态应用 where 子句...

java - Neo4j 嵌入式数据库忽略事务日志限制

java - Android 的 rawQuery() 错误

Java Web Start 和安全