2016-07-27 2 views
0

Я пытаюсь создать базу данных диаграммы 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, но на самом деле не создает каких-либо вершин. Но если я позвоню ему из студии, это сработает!?! Я понятия не имею, что происходит.

ответ

0

Вы могли бы попробовать что-то вроде:

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

UPDATE

я использовал этот код (версию 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); 

Надеется, что это помогает

+0

Хорошо, попробовал это, и он разбился с помощью '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

+0

Кроме того, не существует никакого реального кода создания вершин в том, что вы написали ... Код' CREATE FUNCTION' полезно знать, поэтому, спасибо за это. – TomG

+0

Какую версию OrientDb вы используете? Я пробовал с 2.1.19, и это сработало для меня –

1

ОК, после большого взлома и поиска в Google, ве получили его работу:

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!

Смежные вопросы