Search code examples
pythonorientdbbulbsrexster

Rexster create edge error with OrientDB


I'm using python bulbs with Rexster and OrientDB. I'm trying to create an edge, but I get this error:

>> g.edges.create(g.V[0], "aoeu", g.V[1])
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/bulbs/element.py", line 879, in create
    resp = self.client.create_edge(outV, label, inV, data, keys=_keys)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rexster/client.py", line 454, in create_edge
    return self.create_indexed_edge(outV,label,inV,data,index_name,keys=keys)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rexster/client.py", line 990, in create_indexed_edge
    resp = self.gremlin(script,params)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rexster/client.py", line 356, in gremlin
    return self.request.post(gremlin_path, params)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rest.py", line 131, in post
    return self.request(POST, path, params)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rest.py", line 186, in request
    return self.response_class(http_resp, self.config)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rexster/client.py", line 198, in __init__
    self.handle_response(response)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rexster/client.py", line 222, in handle_response
    response_handler(http_resp)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rest.py", line 50, in server_error
    raise SystemError(http_resp)
SystemError: ({'status': '500', 'transfer-encoding': 'chunked', 'server': 'grizzly/2.2.16', 'connection': 'close', 'date': 'Fri, 24 Jan 2014 19:49:10 GMT', 'access-control-allow-origin': '*', 'content-type':
 'application/json'}, '{"message":"","error":"javax.script.ScriptException: java.lang.ClassCastException: com.orientechnologies.orient.core.id.ORecordId cannot be cast to com.orientechnologies.orient.core.re
cord.ORecord","api":{"description":"evaluate an ad-hoc Gremlin script for a graph.","parameters":{"rexster.returnKeys":"an array of element property keys to return (default is to return all element propertie
s)","rexster.showTypes":"displays the properties of the elements with their native data type (default is false)","load":"a list of \'stored procedures\' to execute prior to the \'script\' (if \'script\' is n
ot specified then the last script in this argument will return the values","rexster.offset.end":"end index for a paged set of data to be returned","rexster.offset.start":"start index for a paged set of data
to be returned","params":"a map of parameters to bind to the script engine","language":"the gremlin language flavor to use (default to groovy)","script":"the Gremlin script to be evaluated"}},"success":false
}')

The funny thing is when I execute the command again, it works, BUT I get 2 edges created, which is WRONG.

On my Rexster server,

I get this error

....
at Script5.run(Script5.groovy:23)
    at com.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.eval(GremlinGroovyScriptEngine.java:219)
    ... 58 more
[WARN] GraphResource - The [tp:gremlin+*] extension raised an error response.

my graph config

    <graph>
        <graph-enabled>true</graph-enabled>
        <graph-name>orientdb</graph-name>
        <graph-type>orientgraph</graph-type>
        <graph-location>local:/tmp/orientdb</graph-location>
        <properties>
            <username>admin</username>
            <password>admin</password>
        </properties>
        <extensions>
            <allows>
                <allow>tp:gremlin</allow>
            </allows>
        </extensions>
    </graph>

What is the error I keep getting, and how do I fix it?

Added DEBUG info:

>>> from bulbs.rexster import DEBUG
>>> g.config.set_logger(DEBUG)
>>> g.edges.create(g.V[0], "a", g.V[1])
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST body: {"params": null, "script": "g.getVertices()"} 
POST body: {"params": null, "script": "g.getVertices()"} 
POST body: {"params": null, "script": "g.getVertices()"} 
POST body: {"params": null, "script": "g.getVertices()"} 
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST body: {"params": null, "script": "g.getVertices()"} 
POST body: {"params": null, "script": "g.getVertices()"} 
POST body: {"params": null, "script": "g.getVertices()"} 
POST body: {"params": null, "script": "g.getVertices()"} 
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST url:  http://localhost:8182/graphs/orientdb/tp/gremlin  
POST body: {"params": {"label_var": "label", "outV": "#9:0", "keys": null, "data": {}, "inV": "#9:1", "index_name": "edge", "label": "a"}, "script": "def createIndexedEdge = {\n    index = g.idx(index_name)\n    edge = g.addEdge(g.v(outV),g.v(inV),label)\n    for (entry in data.entrySet()) {\n      if (entry.value == null) continue;\n      edge.setProperty(entry.key,entry.value)\n      if (keys == null || keys.contains(entry.key))\n\tindex.put(entry.key,String.valueOf(entry.value),edge)\n    }\n    index.put(label_var,String.valueOf(label),edge)\n    return edge\n  }\n  def transaction = { final Closure closure ->\n    try {\n      results = closure();\n      g.commit();\n      return results; \n    } catch (e) {\n      g.rollback();\n      throw e;\n    }\n  }\n  return transaction(createIndexedEdge);"} 
POST body: {"params": {"label_var": "label", "outV": "#9:0", "keys": null, "data": {}, "inV": "#9:1", "index_name": "edge", "label": "a"}, "script": "def createIndexedEdge = {\n    index = g.idx(index_name)\n    edge = g.addEdge(g.v(outV),g.v(inV),label)\n    for (entry in data.entrySet()) {\n      if (entry.value == null) continue;\n      edge.setProperty(entry.key,entry.value)\n      if (keys == null || keys.contains(entry.key))\n\tindex.put(entry.key,String.valueOf(entry.value),edge)\n    }\n    index.put(label_var,String.valueOf(label),edge)\n    return edge\n  }\n  def transaction = { final Closure closure ->\n    try {\n      results = closure();\n      g.commit();\n      return results; \n    } catch (e) {\n      g.rollback();\n      throw e;\n    }\n  }\n  return transaction(createIndexedEdge);"} 
POST body: {"params": {"label_var": "label", "outV": "#9:0", "keys": null, "data": {}, "inV": "#9:1", "index_name": "edge", "label": "a"}, "script": "def createIndexedEdge = {\n    index = g.idx(index_name)\n    edge = g.addEdge(g.v(outV),g.v(inV),label)\n    for (entry in data.entrySet()) {\n      if (entry.value == null) continue;\n      edge.setProperty(entry.key,entry.value)\n      if (keys == null || keys.contains(entry.key))\n\tindex.put(entry.key,String.valueOf(entry.value),edge)\n    }\n    index.put(label_var,String.valueOf(label),edge)\n    return edge\n  }\n  def transaction = { final Closure closure ->\n    try {\n      results = closure();\n      g.commit();\n      return results; \n    } catch (e) {\n      g.rollback();\n      throw e;\n    }\n  }\n  return transaction(createIndexedEdge);"} 
POST body: {"params": {"label_var": "label", "outV": "#9:0", "keys": null, "data": {}, "inV": "#9:1", "index_name": "edge", "label": "a"}, "script": "def createIndexedEdge = {\n    index = g.idx(index_name)\n    edge = g.addEdge(g.v(outV),g.v(inV),label)\n    for (entry in data.entrySet()) {\n      if (entry.value == null) continue;\n      edge.setProperty(entry.key,entry.value)\n      if (keys == null || keys.contains(entry.key))\n\tindex.put(entry.key,String.valueOf(entry.value),edge)\n    }\n    index.put(label_var,String.valueOf(label),edge)\n    return edge\n  }\n  def transaction = { final Closure closure ->\n    try {\n      results = closure();\n      g.commit();\n      return results; \n    } catch (e) {\n      g.rollback();\n      throw e;\n    }\n  }\n  return transaction(createIndexedEdge);"} 
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/bulbs/element.py", line 879, in create
    resp = self.client.create_edge(outV, label, inV, data, keys=_keys)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rexster/client.py", line 454, in create_edge
    return self.create_indexed_edge(outV,label,inV,data,index_name,keys=keys)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rexster/client.py", line 990, in create_indexed_edge
    resp = self.gremlin(script,params)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rexster/client.py", line 356, in gremlin
    return self.request.post(gremlin_path, params)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rest.py", line 131, in post
    return self.request(POST, path, params)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rest.py", line 186, in request
    return self.response_class(http_resp, self.config)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rexster/client.py", line 198, in __init__
    self.handle_response(response)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rexster/client.py", line 222, in handle_response
    response_handler(http_resp)
  File "/usr/local/lib/python2.7/dist-packages/bulbs/rest.py", line 50, in server_error
    raise SystemError(http_resp)
SystemError: ({'status': '500', 'transfer-encoding': 'chunked', 'server': 'grizzly/2.2.16', 'connection': 'close', 'date': 'Mon, 27 Jan 2014 18:33:00 GMT', 'access-control-allow-origin': '*', 'content-type': 'application/json'}, '{"message":"","error":"javax.script.ScriptException: java.lang.ClassCastException: com.orientechnologies.orient.core.id.ORecordId cannot be cast to com.orientechnologies.orient.core.record.ORecord","api":{"description":"evaluate an ad-hoc Gremlin script for a graph.","parameters":{"rexster.returnKeys":"an array of element property keys to return (default is to return all element properties)","rexster.showTypes":"displays the properties of the elements with their native data type (default is false)","load":"a list of \'stored procedures\' to execute prior to the \'script\' (if \'script\' is not specified then the last script in this argument will return the values","rexster.offset.end":"end index for a paged set of data to be returned","rexster.offset.start":"start index for a paged set of data to be returned","params":"a map of parameters to bind to the script engine","language":"the gremlin language flavor to use (default to groovy)","script":"the Gremlin script to be evaluated"}},"success":false}')

Solution

  • Fixed in OrientDB 1.7, see https://github.com/tinkerpop/rexster/issues/341 for more info.