2016-07-27 5 views
0

私はPyOrientを使用してOrientDBグラフデータベースを作成しようとしていますが、関数が機能するための十分なドキュメントが見つかりません。私はrecord_createを使用してofunctionクラスターに関数を作成することができましたが、クラッシュしませんが、どちらも機能していません。 は、ここに私のコードです:すべてのselect addURLのビットを行う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 * from URL単に回やって。おそらく(私がスタジオでデータベースを調べることによって発見したように)まだURLの頂点がないからです。空のリストを返すか、有用なエラーメッセージを出すのではなく、タイムアウトする必要があるのはなぜか分かりませんが。

私は間違っているのですが、PyOrientを使って関数を簡単に作成する方法はありますか?

スタジオで関数を書いてみたいと思っています。なぜなら、プロトタイプを作成していて、それらがPythonコードから書かれているからです。

私は、主にOrientDB wiki pageを使用してOrientDBの機能について調べています。PyOrient github pageは、ほとんどそのドキュメントの唯一のソースです。


編集:私はSQLで動作する関数を作成できましたが(私自身の答えは以下を参照してください)、頂点を作成する動作中のJavascript関数を作成することはできません。私の現在の最高の試みは、次のとおりです。PyOrientから呼び出されたときにクラッシュすることなく実行されますが、実際には任意の頂点を作成しません

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) 

。しかし、スタジオから呼び出すと、機能します!私は何が起こっているのか分かりません。

答えて

0

ようにあなたが何かを試みることができる:私はこのコード(バージョン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); 

はそれが

を役に立てば幸い私のために働いた

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

+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 - コマンド要求のコマンド実行プログラムが見つかりません:sql。%s 保存URL = "plocal:/ opt/orientdb/databases/database" ' – TomG

+0

また、あなたが書いたものに実際の頂点作成コードはないようです... ' CREATE FUNCTION'コードは知っていると便利なので、それに感謝します。 – TomG

+0

使用しているOrientDbのバージョンは何ですか?私は2.1.19で試してみましたが、それは私のために働いた –

1

OK、ハッキングやグーグルリングの後、それは働いています:

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の貧弱なドキュメントで他の人が苦労して助けてくれることを願って私自身の質問に答えています!

関連する問題