Java Gremlin获取所有传入和传出顶点,包括它们的边和方向
我在GremlinShell花了一周时间试图编写一个查询来 获取所有传入和传出顶点,包括它们的边和方向。我什么都试过了Java Gremlin获取所有传入和传出顶点,包括它们的边和方向,java,graph,neo4j,titan,gremlin,Java,Graph,Neo4j,Titan,Gremlin,我在GremlinShell花了一周时间试图编写一个查询来 获取所有传入和传出顶点,包括它们的边和方向。我什么都试过了 g.V("name","testname").bothE.as('both').select().back('both').bothV.as('bothV').select(){it.map()} 我需要的输出是(仅示例结构): [v{'name':“testname”}]\uuuuuu[ine{edge\uu name:“nameofComingEdge”}]\uuuuuu
g.V("name","testname").bothE.as('both').select().back('both').bothV.as('bothV').select(){it.map()}
我需要的输出是(仅示例结构):
[v{'name':“testname”}]\uuuuuu[ine{edge\uu name:“nameofComingEdge”}]\uuuuuuuuu[v{name:'nameofconnectedvertex']
[v{'name':“testname”}]\uuuuuu[oute{edge\u name:“nameofoutgoingedge”}]\uuuuuuuu[v{name:'nameofconnectedvertex']
所以我只想得到1)所有顶点的确切名称,每个顶点的边(包括类型inE或outE)和连接的顶点。理想情况下,在这之后我想得到它们的贴图()因此,我将获得完整的对象属性。我不关心输出样式,我只需要当前的所有信息,以便以后可以使用。我需要这些信息来训练我的小精灵,但欢迎使用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]]]}
转换
将传入顶点转换为贴图
,并对输入/输出边进行内部遍历。您还可以使用路径
获得类似的输出:
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现在可用,如果您刚刚开始,您应该看看最新的版本:
在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]]
我知道您想知道输出中边的方向,但这很容易在路径分析中检测到
更新:以上是丹尼尔关于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()
来区分每个路径
对象-上述查询的扩展将valueMap
应用于每个路径
的每个部分:
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]}]
非常感谢Stephen!我会在家里尝试,如果有帮助的话,我会给你奖金。如果你认为Titan and gremlin是基于这种技术构建大型社交网络的好选择,我也很感兴趣。祝你有一天过得愉快!请注意,
.as('a')。bothE().bothV()。where(neq('a'))
可以重写为。bothE().otherV()
.dah-忘记了其他v
谢谢Steven的回答!我测试了这个,似乎这就是我需要的,但我仍然无法获得.map()(我指的是完整的对象表示)每个结果元素的。无论如何为您打开赏金。将数据作为映射
获取只是对返回的每个路径
对象的转换。请参阅我对TP3的更新答案。在TP2中,我想您必须使用转换
。