0

我正在尝试使用 PyOrient 创建一个 OrientDB 图形数据库,但我找不到足够的文档来让函数正常工作。我已经能够创建一个用于集群的函数record_createofunction但是虽然它没有崩溃,但它似乎也不起作用。这是我的代码:

#!/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 调用时运行而不会崩溃,但实际上并没有创建任何顶点。但如果我从 Studio 调用它,它可以工作!?!我不知道是怎么回事。

4

2 回答 2

2

好的,经过大量的黑客攻击和谷歌搜索,我已经开始工作了:

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 糟糕的文档中苦苦挣扎!

于 2016-07-28T15:58:53.753 回答
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 回答