如何在图表中查找子图

时间:2018-02-15 13:21:01

标签: gremlin

我想在图表中选择子图(而不仅仅是路径)。作为一个例子,在"现代" Tinkerpop图(见下图)我试图选择整个图。

第一个问题g.V(6).out('created').has('name', 'lop').both('created').or(__.has("age", 29), __.has("name", "josh")).path()让我几乎到了 - 从彼得到乔希和马可的两条路。我只需要扩展路径以包含Ripple和Vadas。

第二个查询g.V(6).out('created').has('name', 'lop').both('created').or(__.has("age", 29), __.has("name", "josh")).V().or(__.has("name", "ripple"), __.has("name", "vadas")).path()意外地产生了四条路径,而不是两条路径。我希望查询结果是

==>[v[6],v[3],v[1],v[2]]
==>[v[6],v[3],v[4],v[5]]

相反,我得到

==>[v[6],v[3],v[1],v[2]]
==>[v[6],v[3],v[1],v[5]]
==>[v[6],v[3],v[4],v[2]]
==>[v[6],v[3],v[4],v[5]]

以下是整个事情:

gremlin> graph = TinkerFactory.createModern()
gremlin> g = graph.traversal()
gremlin> g.V(6).out('created').has('name', 'lop').both('created').or(__.has("age", 29), __.has("name", "josh")).path()
==>[v[6],v[3],v[1]]
==>[v[6],v[3],v[4]]
gremlin> g.V(6).out('created').has('name', 'lop').both('created').or(__.has("age", 29), __.has("name", "josh")).V().or(__.has("name", "ripple"), __.has("name", "vadas")).path()
==>[v[6],v[3],v[1],v[2]]
==>[v[6],v[3],v[1],v[5]]
==>[v[6],v[3],v[4],v[2]]
==>[v[6],v[3],v[4],v[5]]

请注意,我尝试使用2.6.0版本执行此操作。我做错了什么?

enter image description here

1 个答案:

答案 0 :(得分:2)

在TinkerPop 3.x中,我会使用subgraph() - 步骤。它会生成一个边缘引起的子图,这意味着它会收集您遍历到新图形中的边以及它们所连接的相邻顶点。

您的问题表明您正在尝试选择整个图表。"如果是这样,那么就这样做:

gremlin> sg = g.E().subgraph('sg').cap('sg').next().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]

它迭代图中的所有边并将它们推入一个新的图形,标记为" sg",我们cap()最后输出到新的Graph实例中。

更有可能的是,您需要将图形的某些部分过滤到子图中,所以只需编写遍历并收集Gremlin遍历的边缘:

gremlin> sg = g.V().has('name','marko').outE('knows').subgraph('sg').inV().outE('created').subgraph('sg').cap('sg').next().traversal()
==>graphtraversalsource[tinkergraph[vertices:5 edges:4], standard]