Search code examples
python-2.7pycharmpy2neo

py2neo 2.0 bind and push node errors


Using Py2Neo 2.0 and Pycharm Community Edition 4

I'm trying to update a node. First I get the node object, change a node property, bind to the database, and then push the node. I get a slew of errors. Here is the code.

user_node = Graph().find_one('USER',
                             property_key='email',
                             property_value='marnee@marnee.com')    
user_properties['mission_statement'] = 'New mission statement'
user_node.bind(uri=Graph().uri)
user_node.push()

The node is found, it does have a mission_statement property. The exception seems to happen on .push(). The Graph() uri is good, too.

Below are the errors.

I had been able to do this successfully about a week ago. I have not updated any packages recently.

The really weird part is that if I have a breakpoint and run this in debug mode I do not get any errors and the node is updated successfully.

Traceback (most recent call last):
  File "C:/Users/Marnee Dearman/PycharmProjects/AgoraDev/py2neo_2.0_tests/create_rel_int_loc.py", line 27, in <module>
    user_node.push()
  File "C:\Users\Marnee Dearman\PycharmProjects\VirtualEnvs\AgoraDev\lib\site-packages\py2neo\core.py", line 1519, in push
    batch.push()
  File "C:\Users\Marnee Dearman\PycharmProjects\VirtualEnvs\AgoraDev\lib\site-packages\py2neo\batch\push.py", line 73, in push
    self.graph.batch.run(self)
  File "C:\Users\Marnee Dearman\PycharmProjects\VirtualEnvs\AgoraDev\lib\site-packages\py2neo\batch\core.py", line 99, in run
    response = self.post(batch)
  File "C:\Users\Marnee Dearman\PycharmProjects\VirtualEnvs\AgoraDev\lib\site-packages\py2neo\batch\core.py", line 88, in post
    data.append(dict(job, id=i))
  File "C:\Users\Marnee Dearman\PycharmProjects\VirtualEnvs\AgoraDev\lib\site-packages\py2neo\batch\core.py", line 232, in __iter__
    yield "to", self.target.uri_string
  File "C:\Users\Marnee Dearman\PycharmProjects\VirtualEnvs\AgoraDev\lib\site-packages\py2neo\batch\core.py", line 180, in uri_string
    uri_string = self.entity.ref
  File "C:\Users\Marnee Dearman\PycharmProjects\VirtualEnvs\AgoraDev\lib\site-packages\py2neo\core.py", line 1421, in ref
    return "node/%s" % self._id
  File "C:\Users\Marnee Dearman\PycharmProjects\VirtualEnvs\AgoraDev\lib\site-packages\py2neo\core.py", line 1412, in _id
    self.__id = int(self.uri.path.segments[-1])
ValueError: invalid literal for int() with base 10: ''

Using Nigel's advice below, I got this to work. It was a usage error on my part:

user_node = Graph().find_one('USER',
                             property_key='email',
                             property_value='marnee@email.com')
user_node.properties['mission_statement'] = 'New mission statement'
user_node.push()

Solution

  • There are a couple of problems with your code so I will try to clarify the correct usage of these methods.

    The bind method is used to connect a local entity (in this case, Node) to a corresponding remote equivalent. You should generally never need to use this method explicitly as entities are typically bound automatically on creation or retrieval. In your case, the find_one method does exactly this and constructs a client-side node that is bound to a corresponding server-side node; an explicit bind is not required.

    The second issue is with your usage of bind. The URI taken by this method is that of a specific remote resource. You have passed the URI of the Graph itself (probably http://localhost:7474/db/data/) instead of that of the Node (such as http://localhost:7474/db/data/node/2345). The actual error that you see is caused by py2neo attempting to strip the ID from the URI and failing.

    The simple solution is to remove the bind call.