私は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)
。しかし、スタジオから呼び出すと、機能します!私は何が起こっているのか分かりません。
これを試したところ、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
また、あなたが書いたものに実際の頂点作成コードはないようです... ' CREATE FUNCTION'コードは知っていると便利なので、それに感謝します。 – TomG
使用しているOrientDbのバージョンは何ですか?私は2.1.19で試してみましたが、それは私のために働いた –