2016-07-27 77 views
0

我正在尝试使用PyOrient创建一个OrientDB图形数据库,并且我找不到足够的文档来允许我使用函数工作。我已经能够使用record_create创建一个函数到ofunction群集中,但是虽然它没有崩溃,但它似乎也不起作用。 这里是我的代码:如何使用PyOrient在OrientDB中创建函数(存储过程)?

#!/usr/bin/python 

import pyorient 

ousername="user" 
opassword="pass" 

client = pyorient.OrientDB("localhost", 2424) 
session_id = client.connect(ousername, opassword) 

db_name="database" 

client.db_create(db_name, pyorient.DB_TYPE_GRAPH, pyorient.STORAGE_TYPE_PLOCAL) 

# Set up the schema of the database 
client.command("create class URL extends V") 
client.command("CREATE PROPERTY URL.url STRING") 
client.command("CREATE PROPERTY URL.id INTEGER") 
client.command("CREATE SEQUENCE urlseq") 
client.command("CREATE INDEX urls ON URL (url) UNIQUE") 

# Get the id numbers of all the clusters 
info=client.db_reload() 
clusters={} 
for c in info: 
    clusters[c.name]=c.id 
print(clusters) 

# Construct a test function 
# All this should do is create a new URL vertex. Eventually it will check for uniqueness of url, etc. 
code="INSERT INTO URL SET id = sequence('urlseq').next(), url='?'" 
addURL_func = { '@OFunction': { 'name': 'addURL', 'code':'orient.getGraph().command("sql","%s",[urlparam]);' % code, 'language':'javascript', 'parameters':'urlparam', 'idempotent':False } } 
client.record_create(clusters['ofunction'], addURL_func) 

# Assume allURLs contains the list of URLs I want to store 
for url in allURLs: 
    client.command("select addURL('%s')" % url) 

vs = client.command("select * from URL") 
for v in vs: 
    print(v.url) 

做所有的select addURL位运行愉快,但这样做只是select * from URL超时。大概是因为(正如我通过检查Studio中的数据库发现的那样),顶点仍然没有URL顶点。虽然为什么应该超时而不是返回一个空列表或给出一个有用的错误信息,我不确定。

我在做什么错误,是否有更简单的方法通过PyOrient创建函数?

我不想只是在Studio中编写函数,因为我正在构建原型,希望他们从Python代码中编写而不是每次丢失损坏的实验图时都会丢失!

我主要使用OrientDB wiki page来了解OrientDB的功能,以及PyOrient github page几乎是我唯一的文档来源。


编辑:我已经能够在SQL中创建一个工作函数(请参阅我自己的答案),但我仍然无法创建一个可以创建顶点的可用JavaScript函数。我目前的最佳尝试是:

code2="""var g=orient.getGraph();g.command('sql','CREATE VERTEX URL SET id = sequence(\\"urlseq\\").next(), url = \\"'+urlparam+'\\"',[urlparam]);""" 
myFunction2 = 'CREATE FUNCTION addURL2 "' + code2 + '" parameters [urlparam] idempotent false language javascript' 
client.command(myFunction2) 

从PyOrient调用时没有崩溃但没有实际创建任何顶点。但是,如果我从Studio中调用它,它的工作原理!?!我不知道发生了什么事。

回答

0

你可以尝试这样的:

code="var g=orient.getGraph();\ng.command(\\'sql\\',\\'%s\\',[urlparam]);" 
myFunction = "CREATE FUNCTION addURL '" + code + "' parameters [urlparam] idempotent false language javascrip" 
client.command(myFunction); 

UPDATE

我用这个代码(2.2.5版本)和它的工作对我来说

code="var g=orient.getGraph().command(\\'sql\\',\\'%s\\',[urlparam]);" 
myFunction = "CREATE FUNCTION addURL '" + code + "' parameters [urlparam] idempotent false language javascrip" 
client.command(myFunction); 

希望它可以帮助

+0

好吧,试过了,它用'pyorient.exceptions.PyOrientCommandException:com.orientechnologies.orient.core.sql.parser.TokenMgrError - 第1行第49列的词法错误崩溃。遇到:“\ n”(10 )之后:“\'var g = orient.getGraph();”'。所以我删除了'\ n',因为它似乎没有必要。然后进一步,但是用'pyorient.exceptions.PyOrientCommandException:com.orientechnologies.orient.core.command.OCommandExecutorNotFoundException异常 - 无法为命令request:sql找到命令执行程序。%s 存储URL =“plocal:/ opt/orientdb/databases/database” – TomG

+0

另外,在你写的内容中似乎没有任何实际的顶点创建代码... CREATE FUNCTION代码是尽管知道有用,所以非常感谢。 – TomG

+0

您使用的是什么版本的OrientDb?我用2.1.19试过了,它对我很有用 –

1

好吧,经过大量的黑客和谷歌搜索, ve得到它的工作:

code="CREATE VERTEX URL SET id = sequence('urlseq').next(), url = :urlparam;" 
myFunction = 'CREATE FUNCTION addURL "' + code + '" parameters [urlparam] idempotent false language sql' 
client.command(myFunction) 

这里的关键似乎是在OrientDB的SQL版本的参数名称之前使用冒号。在OrientDB文档中我找不到任何地方提及这个,但有人在网上发现它。 我在回答我自己的问题,希望这将帮助其他人与ODB糟糕的文档一起苦苦挣扎!

相关问题