灯泡:如何检查两个顶点是否通过Titan中的边连接

时间:2014-07-08 07:56:00

标签: groovy cassandra gremlin titan bulbs

我正在使用TitanGraphDB + Cassandra。我正在按照以下方式启动Titan

cd titan-cassandra-0.3.1
bin/titan.sh config/titan-server-rexster.xml config/titan-server-cassandra.properties

我有一个Rexster shell,我可以使用它与上面的Titan + Cassandra进行交流。

cd rexster-console-2.3.0
bin/rexster-console.sh

我正在尝试使用Titan Graph DB建模网络拓扑。我想从我的python程序中编写Titan Graph DB。我正在使用灯泡包。 我创建了三种类型的顶点

 - switch
 - port 
 - device

我在物理连接的端口之间创建带标签的边缘。我使用的标签是“link”。

我们假设我有两个端口顶点portAportB

我想写一个函数,如下所示

def is_connected(portA, portB):
     ...
     ... 
     ...

如何找到两个顶点是否“通过标记边连接”?

我有两个图顶点

src_sw_other_ports
<Vertex: http://localhost:8182/graphs/graph/vertices/48>

dst_sw_other_ports
<Vertex: http://localhost:8182/graphs/graph/vertices/72>

我试过了

link_exists = src_sw_other_ports.out.retain([dst_sw_other_ports]).hasNext()

它给了我以下错误。

  File "/home/karthik/Projects/ryu/ryu/app/simple_switch.py", line 238, in compute_path
    link_exists = src_sw_other_ports.out.retain([dst_sw_other_ports]).hasNext()
  File "/usr/local/lib/python2.7/dist-packages/bulbs/element.py", line 209, in __getattr__
    raise AttributeError(name)
AttributeError: out

2 个答案:

答案 0 :(得分:4)

espeed的答案很好。这是另一种选择:

gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> v1 = g.v(1)
==>v[1]
gremlin> v3 = g.v(3)
==>v[3]
gremlin> v6 = g.v(6)
==>v[6]
gremlin> v1.out.retain([v3]).hasNext()
==>true
gremlin> v1.out.retain([v6]).hasNext()
==>false

比使用count好一点,好像你只想要一个边缘的“存在”,你不必迭代整个管道就可以了。

答案 1 :(得分:2)

def is_connected(portA, portB):
    return portA.both("link").retain([portB]).hasNext()

请参阅http://gremlindocs.com/#recipes/finding-edges-between-vertices

注意:我在上面的代码中使用了你的函数定义;但是,你的函数定义使用的是Python语法,而不是Groovy,所以上面的例子只有在你从Jython调用Gremlin代码时才有效。

Gremlin-Groovy的定义是:

def isConnected (portA, portB) {
     return portA.both("link").retain([portB]).hasNext()
}