0

PyOrient を使用して OrientDB グラフ データベースを作成しようとしていますが、関数を機能させるのに十分なドキュメントが見つかりません。record_createを使用してクラスターに関数を作成できましたがofunction、クラッシュはしませんが、機能していないようです。これが私のコードです:

#!/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 ページを使用して OrientDB の機能について調べ、PyOrient github ページをほぼ唯一のドキュメント ソースとして使用しています。


編集: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 から呼び出されたときにクラッシュすることなく実行されますが、実際には頂点を作成しません。しかし、スタジオから呼び出すと動作します!?! 何が起こっているのかわかりません。

4

2 に答える 2

1

次のようなものを試すことができます:

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

アップデート

このコード(バージョン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);

それが役に立てば幸い

于 2016-07-28T09:12:24.430 に答える