如何获得给定顶点的最小子图?

时间:2015-01-11 13:51:34

标签: python neo4j graph-databases titan

我有一张图表。我想提取一个包含列表中节点的子图以及链接到列表中节点的其他节点。

示例:图形有4个节点:1,2,3,4,边缘为1-2,3-3,1-4,3-4。如果我的列表有节点1,4,那么子图应该是1-2,1-4和3-4

为此目的,在python库中是否有像py2neo这样的函数?

2 个答案:

答案 0 :(得分:3)

对于neo4j,您可以使用Cypher queries从数据库中提取子图。您只需使用查询的MATCH子句来表达您正在寻找的模式。

在python中,您可能使用py2neo来运行cypher查询。在这里,我假设您拥有的节点列表是节点ID。您可以执行以下操作:

from py2neo import Graph
graph = Graph()
targets = [1,4]
for target in targets:
    results = graph.cypher.execute("MATCH (n {id: %d})-[:foo]->(otherNode) RETURN n, otherNode" % target)
    # process results

有一点需要注意。你的图表指定1连接到4,但是3也是3.这实际上会使连接的子图组件1-3-4,而不是1-4和3-4。因为您是这样指定的,请注意我上面所做的匹配只是从您正在搜索的节点中提供一跳。

答案 1 :(得分:1)

以下是使用Gremlin的方法。

如果你想把你的结果作为一棵树:

gremlin> g.v(1,4).both().tree().cap().next()
==>v[1]={v[2]={}, v[4]={}}
==>v[4]={v[1]={}, v[3]={}}

或者,如果您更喜欢真实的子图,请使用recipe from the GremlinDocs

gremlin> sg = new TinkerGraph()
==>tinkergraph[vertices:0 edges:0]
gremlin> goc = { v, g ->
gremlin>   g.getVertex(v.id) ?: g.addVertex(v.id, ElementHelper.getProperties(v))
gremlin> }
==>groovysh_evaluate$_run_closure1@5118388b
gremlin> g.E().filter { it.bothV().retain(g.v(1,4).toList()).hasNext() }.sideEffect {
gremlin>  sg.addEdge(it.id, goc(it.outV.next(), sg), goc(it.inV.next(), sg), it.label,
gremlin>      ElementHelper.getProperties(it))
gremlin> }.iterate()
==>null
gremlin> sg.V()
==>v[1]
==>v[2]
==>v[3]
==>v[4]
gremlin> sg.E()
==>e[0][1-link->2]
==>e[2][1-link->4]
==>e[3][3-link->4]

我不熟悉Python库,但我想它只是复制和放大。如果您正在使用Bulbs,请粘贴。