2016-07-27 15 views
0

Ich versuche, eine OrientDB Graph Datenbank mit PyOrient zu erstellen, und ich kann nicht genug Dokumentation finden, um mir zu ermöglichen, Funktionen zu arbeiten. Ich konnte eine Funktion mit record_create im ofunction Cluster erstellen, aber obwohl es nicht abstürzt, scheint es auch nicht zu funktionieren. Hier ist mein Code:Wie verwende ich PyOrient um Funktionen (gespeicherte Prozeduren) in OrientDB zu erstellen?

#!/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) 

alle select addURL Bits Doing läuft glücklich, sondern aus select * from URL einfach mal tun. Vermutlich, weil es (wie ich durch Untersuchung der Datenbank in Studio herausgefunden habe) immer noch keine URL Vertices gibt. Warum sollte das eigentlich Zeitüberschreitung sein, anstatt eine leere Liste zurückzugeben oder eine sinnvolle Fehlermeldung zu geben, bin ich mir nicht sicher.

Was mache ich falsch, und gibt es eine einfachere Möglichkeit, Funktionen über PyOrient zu erstellen?

Ich möchte nicht nur die Funktionen in Studio schreiben, weil ich Prototyping bin und möchte, dass sie aus dem Python-Code geschrieben sind, anstatt jedes Mal verloren zu gehen, wenn ich das zerlegte experimentelle Diagramm lösche!

Ich habe hauptsächlich die OrientDB wiki page verwendet, um über OrientDB Funktionen zu erfahren, und die PyOrient github page als fast meine einzige Quelle der Dokumentation dafür.


Edit: Ich konnte eine funktionierende Funktion in SQL erstellen (siehe meine eigene Antwort unten), aber ich kann immer noch keine funktionierende Javascript-Funktion erstellen, die einen Scheitelpunkt erstellt. Mein aktueller bester Versuch ist:

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) 

, die ohne Absturz läuft, wenn sie von PyOrient genannt, aber nicht schafft tatsächlich keine Ecken. Aber wenn ich es von Studio aus anrufe, funktioniert es!?! Ich habe keine Ahnung, was los ist.

Antwort

0

Sie könnten versuchen, so etwas wie:

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

ich diesen Code verwendet (Version 2.2.5) und es funktionierte für mich

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

Hoffe, es hilft

+0

Ok, versuchte das, und es stürzte mit 'pyorient.exceptions.PyOrientCommandException: com.orientechnologies.orient.core.sql.parser.TokenMgrError - Lexikalischer Fehler in Zeile 1, Spalte 49. Entdeckt:" \ n "(10), nach: "\ 'var g = orient.getGraph();" '. Also habe ich das '\ n' entfernt, da es unnötig erscheint. Dann wurde es ein wenig weiter, aber stürzte mit 'pyorient.exceptions.PyOrientCommandException: com.orientechnologies.orient.core.command.OCommandExecutorNotFoundException - Kann einen Befehls-Executor für die Befehlsanforderung nicht finden: sql.% s Storage URL = "plocal:/opt/orientdb/Datenbanken/Datenbank" ' – TomG

+0

Auch scheint es keine tatsächlichen Vertex-Creation-Code in dem, was Sie geschrieben haben ... Der' CREATE FUNCTION' Code ist nützlich zu wissen, aber danke dafür. – TomG

+0

Welche Version von OrientDb verwenden Sie? Ich versuchte mit 2.1.19 und es funktionierte für mich –

1

OK, nach viel hacken und googeln, ich ' es ve bekam Arbeit:

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) 

Der Schlüssel ist hier die Verwendung eines Doppelpunkt vor Parameternamen in Orientdb Version von SQL zu sein scheint. Ich konnte in den OrientDB-Dokumenten nirgends einen Verweis darauf finden, aber jemand, der online war, hatte es irgendwie entdeckt. Ich beantworte meine eigene Frage in der Hoffnung, dass dies anderen helfen wird, mit der schlechten Dokumentation von ODB zu kämpfen!