Я пытаюсь создать базу данных диаграммы OrientDB с помощью PyOrient, и я не могу найти достаточную документацию, чтобы позволить мне работать с функциями. Я смог создать функцию, используя record_create
в кластере ofunction
, но, хотя он не сбой, он тоже не работает. Вот мой код:Как использовать 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 addURL
бит работает счастливо, но делать select * from URL
просто раз вне. Предположительно, потому что (как я обнаружил, исследуя базу данных в Studio), до сих пор нет URL
вершин. Хотя почему это должно быть тайм-аут вместо того, чтобы возвращать пустой список или давать полезное сообщение об ошибке, я не уверен.
Что я делаю неправильно, и есть ли более простой способ создания функций через PyOrient?
Я не хочу просто писать функции в Studio, потому что я прототипирую и хочу, чтобы они были написаны из кода Python, а не терялись каждый раз, когда я бросаю искаженный экспериментальный график!
Я в основном использовал OrientDB wiki page, чтобы узнать о функциях OrientDB и PyOrient github page как о почти единственном источнике документации для этого.
Редактировать: Я смог создать рабочую функцию в 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, но на самом деле не создает каких-либо вершин. Но если я позвоню ему из студии, это сработает!?! Я понятия не имею, что происходит.
Хорошо, попробовал это, и он разбился с помощью '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, и это сработало для меня –