首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PyOrient在OrientDB中创建函数(存储过程)?

如何使用PyOrient在OrientDB中创建函数(存储过程)?
EN

Stack Overflow用户
提问于 2016-07-27 17:22:32
回答 1查看 722关注 0票数 0

我试图使用OrientDB创建一个PyOrient图形数据库,但我找不到足够的文档来使函数工作。我已经能够使用record_createofunction集群中创建一个函数,但是尽管它没有崩溃,但它似乎也不起作用。这是我的密码:

代码语言:javascript
复制
#!/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维基页面来了解OrientDB函数,而PyOrient github页面几乎是我唯一的文档来源。

编辑:我已经能够在SQL中创建一个工作函数(见下面的答案),但我仍然不能创建一个创建顶点的工作Javascript函数。我目前最好的尝试是:

代码语言: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调用时不会崩溃,但实际上不会创建任何顶点。但是如果我从演播室叫它,它就能工作!?!我不知道怎么回事。

EN

回答 1

Stack Overflow用户

发布于 2016-07-28 09:12:24

你可以尝试这样的方法:

代码语言:javascript
复制
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版),它对我起了作用

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

希望它能帮上忙

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38619508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档