Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gremlin获取所有传入和传出顶点,包括它们的边和方向_Java_Graph_Neo4j_Titan_Gremlin - Fatal编程技术网

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

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

我在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”}]\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中,我想您必须使用
转换