我使用的是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。为此,我使用了bulbs包。我创建了五种类型的顶点
- switch
- port
- device
- flow
- flow_entry我在逻辑连接的顶点之间创建边。这些边没有标签。
假设我想测试Vertex A和Vertex B之间的连通性
我有一个groovy脚本is_connected.groovy
def isConnected (portA, portB) {
return portA.both().retain([portB]).hasNext()
}现在从我的rexster控制台
g = rexster.getGraph("graph")
==>titangraph[embeddedcassandra:null]
rexster[groovy]> g.V('type', 'flow')
==>v[116]
==>v[100]
rexster[groovy]> g.V('type', 'flow_entry')
==>v[120]
==>v[104]正如您在上面看到的,我有两个flow v[116]和v[100]类型的顶点
我有两个类型为flow_entry v[120]和v[104]的顶点
我想检查v[120]和v[116]之间的连接,例如
rexster[groovy]> ?e is_connected.groovy
==>null
rexster[groovy]> is_connected(g.v(116),g.v(120))
==>true到目前为止,我希望能够从我的导入灯泡包的good.Now程序中使用这个脚本。
我的目录结构如下。
Projects/ryu
--> ryu/app_simple_switch.py
Projects/ryu_extras
--> rexster-console-2.3.0
--> titan-cassandra-0.3.1我的包含isConnected()函数/过程的脚本is_connected.groovy保存在Projects/ryu_extras/rexster-console-2.3.0中
现在,从我的python程序(用Projects/ryu/ryu/app/simple_switch.py编写)中,我尝试执行以下操作。
self.g.scripts.update('Projects/ryu_extras/rexster-console-2.3.0/is_connected.groovy') # add file to scripts index
script = self.g.scripts.get('isConnected') # get a function by its name
params = dict(portA=flow,portB=fe1) # put function params in dict
items = self.g.gremlin.query(script, params)
self.create_outgoing_edge(flow,fe1)
self.create_outgoing_edge(fe1,sw_vertex)我得到以下错误。
hub: uncaught exception: Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/ryu/lib/hub.py", line 48, in _launch
func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/ryu/base/app_manager.py", line 256, in _event_loop
handler(ev)
File "/home/karthik/Projects/ryu/ryu/app/simple_switch.py", line 322, in _packet_in_handler
self.compute_path(src,dst,datapath)
File "/home/karthik/Projects/ryu/ryu/app/simple_switch.py", line 289, in compute_path
self.g.scripts.update('/home/karthik/Projects/ryu_extras/rexster-console-2.3.0/is_connected.groovy') # add file to scripts index
File "/usr/local/lib/python2.7/dist-packages/bulbs/groovy.py", line 120, in update
methods = self._get_methods(file_path)
File "/usr/local/lib/python2.7/dist-packages/bulbs/groovy.py", line 160, in _get_methods
return Parser(file_path).get_methods()
File "/usr/local/lib/python2.7/dist-packages/bulbs/groovy.py", line 255, in __init__
Scanner(handlers).scan(groovy_file)
File "/usr/local/lib/python2.7/dist-packages/bulbs/groovy.py", line 246, in scan
self.get_item(fin,line)
File "/usr/local/lib/python2.7/dist-packages/bulbs/groovy.py", line 236, in get_item
content = "\n".join(sections).strip()
TypeError: sequence item 2: expected string or Unicode, NoneType found如你所见,错误出在scripts.update()函数中,我只是不知道我在做什么,如果能得到wrong.Any帮助,我将不胜感激。
发布于 2014-07-20 13:07:13
您需要将脚本保存在名为gremlin.groovy的文件中,或者在从灯泡脚本索引中获取脚本时指定脚本的名称空间。
与Rexster类似,Bulbs使用Groovy文件名的第一部分作为名称空间。
例如,将gremlin.groovy文件中定义的方法添加到灯泡gremlin命名空间。
灯泡的所有预定义Gremlin脚本都在gremlin.groovy文件中定义,因此gremlin是默认名称空间:
你的应用程序中可以有多个/额外的gremlin.groovy文件。如果您希望将所有内容都保留在相同的名称空间下,或者如果您希望覆盖预定义的方法,请执行此操作:
>>> g.scripts.update("/path/to/gremlin.groovy") # add scripts to gremlin namespace你看..。https://github.com/espeed/bulbs/blob/f666fa89b3c99bc0a6b4e964aa1bff70b05a2e96/bulbs/groovy.py#L112
您可以通过在名为myapp.groovy或somemodel.groovy的文件中定义Gremlin方法来创建特定于应用程序和特定于模型的名称空间
>>> g.scripts.update("/path/to/myapp.groovy") # add scripts to myapp namespace
>>> g.scripts.update("/path/to/somemodel.groovy") # add scripts to somemodel namespace然后,要获取特定名称空间下的脚本,请执行以下操作:
>>> script = g.scripts.get('myapp:isConnected') # use prefix notation, or...
>>> script = g.scripts.get('isConnected', 'myapp') # specify namespace as arg你看..。https://github.com/espeed/bulbs/blob/f666fa89b3c99bc0a6b4e964aa1bff70b05a2e96/bulbs/groovy.py#L77
要为每个命名空间生成串联的服务器端脚本文件,请使用g.make_script_files()方法:
>>> g.make_script_files() # write files to the current dir, or...
>>> g.make_script_files("/path/to/scripts/dir") # write files to specified dirmake_scripte_files()方法将为每个命名空间创建单独的.groovy文件。如果重写命名空间中的方法,则生成的文件中将只包含最新的方法。
有关更多详细信息,请参阅...
使用带有灯泡https://groups.google.com/d/topic/gremlin-users/Up3JQUwrq-A/discussion的Rexster服务器端脚本的
发布于 2014-07-19 18:55:51
可能有一种“灯泡方式”可以做到这一点,但您可以尝试通过使用Rexster将函数放在服务器上来全局公开您的函数。然后,在<script-engine><init-scripts>部分中,您只需添加您的is_connected.groovy。示例rexster.xml应该已经有一个这样的示例:
<script-engines>
<script-engine>
<name>gremlin-groovy</name>
<reset-threshold>-1</reset-threshold>
<init-scripts>config/is_connected.groovy</init-scripts>
<imports>com.tinkerpop.rexster.client.*</imports>
<static-imports>java.lang.Math.PI</static-imports>
</script-engine>
</script-engines>https://stackoverflow.com/questions/24835231
复制相似问题