【发布时间】:2017-07-04 23:32:40
【问题描述】:
我们有数百万个顶点和数千万条边来形成一个有向图。有人知道如何在 Titan 中的两个给定顶点之间获取子图吗?
【问题讨论】:
我们有数百万个顶点和数千万条边来形成一个有向图。有人知道如何在 Titan 中的两个给定顶点之间获取子图吗?
【问题讨论】:
TinkerPop 提供了两种子图方法:
使用subgraph 步骤将子图“弹出”到单独的图实例中。您可以在以下示例中看到图“g”如何被子图化为“知道”边的新 Graph 实例:
gremlin> subGraph = g.E().hasLabel('knows').subgraph('subGraph').cap('subGraph').next() //(1)
==>tinkergraph[vertices:3 edges:2]
gremlin> sg = subGraph.traversal()
==>graphtraversalsource[tinkergraph[vertices:3 edges:2], standard]
gremlin> sg.E() //(2)
==>e[7][1-knows->2]
==>e[8][1-knows->4]
如果您只想遍历图表的子集,您可以使用Subgraph 策略:
gremlin> graph = TinkerFactory.createTheCrew()
==>tinkergraph[vertices:6 edges:14]
gremlin> g = graph.traversal().withStrategies(SubgraphStrategy.build().
vertices(or(hasNot('location'),properties('location').count().is(gt(3)))).
edges(hasLabel('develops')).
vertexProperties(or(hasLabel(neq('location')),hasNot('endTime'))).create())
==>graphtraversalsource[tinkergraph[vertices:6 edges:14], standard]
gremlin> g.V().valueMap(true)
==>[id:1,label:person,name:[marko],location:[santa fe]]
==>[id:8,label:person,name:[matthias],location:[seattle]]
==>[id:10,label:software,name:[gremlin]]
==>[id:11,label:software,name:[tinkergraph]]
gremlin> g.E().valueMap(true)
==>[id:13,label:develops,since:2009]
==>[id:14,label:develops,since:2010]
==>[id:21,label:develops,since:2012]
根据您的问题的标题,听起来您只需要两个顶点的图形,它们之间有边。我想听起来你会想使用subgraph 步骤。当然,得到这个结果似乎比这更容易:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V(1).bothE().where(otherV().hasId(2))
==>e[7][1-knows->2]
拥有边列表在某种意义上构成子图,尤其是在两个已知顶点的情况下。
【讨论】:
g.v(1).bothE.as('x').bothV.retain([g.v(3)]).back('x') 复制自 gremlindocs.com