How to merge nodes and relationships using py2neo v4 and Neo4j

py2neo

(A Bramson) #1

I am trying to perform a basic merge operation to add nonexistent nodes and relationships to my graph by going through a csv file row by row. I'm using py2neo v4, and because there is basically no documentation or examples of how to use py2neo, I can't figure out how to actually get it done. This isn't my real code (it's very complicated to handle many different cases) but its structure is basically like this:

import py2neo as pn
graph = pn.Graph("bolt://localhost:###/", user="neo4j", password="py2neoSux")
matcher = pn.NodeMatcher(graph)
tx = graph.begin()

if (matcher.match("Prefecture", name="foo").first()) == None):
  previousNode = pn.Node("Type1", name="fo0", yc=1)
else:
  previousNode = matcher.match("Prefecture", name="foo").first())

thisNode = pn.Node("Type2", name="bar", yc=1)
tx.merge(previousNode)  
tx.merge(thisNode)  
theLink = pn.Relationship(thisNode, "PARTOF", previousNode)
tx.merge(theLink)
tx.commit() 

Currently this throws the error
ValueError: Primary label and primary key are required for MERGE operation
the first time it needs to merge a node that it hasn't found (i.e., when creating a node). So then I change the line to:

tx.merge(thisNode,primary_label=list(thisNode.labels)[0], primary_key="name")  

Which gives me the error IndexError: list index out of range from somewhere deep in the py2neo source code (....site-packages\py2neo\internal\operations.py", line 168, in merge_subgraph at node = nodes[i]). I tried to figure out what was going wrong there, but I couldn't decipher where the nodes list come from through various connections to other commands.

So, it currently matches and creates a few nodes without problem, but at some point it will match until it needs to create and then fails in trying to create that node (even though it is using the same code and doing the same thing under the same circumstances in a loop). It made it through all 20 rows in my sample once, but usually stops on the row 3-5.

I thought it had something to do with the transactions (see comments), but I get the same problem when I merge directly on the graph. Maybe it has to do with the py2neo merge function finding more identities for nodes than nodes. Maybe there is something wrong with how I specified my primarily label and/or key.
Because this error and code are opaque I have no idea how to move forward.

Anybody have any advice or instructions on merging nodes with py2neo?

Of course I'd like to know how to fix my current problem, but more generally I'd like to learn how to use this package. Examples, instructions, real documentation?


(A Bramson) #2

Since the last feedback I got was that py2neo is not supported by Neo4j, but that the bolt drivers are, an alternative solution would be to provide instructions on how to do the same thing using those python bolt drivers.

After an excessive amount of effort I was able to use the results of a Cypher query in Python using py2neo (https://stackoverflow.com/questions/52660870/use-py2neo-to-return-nodes-from-cypher-query/52734369#52734369), From what I have read on the bolt drivers, this may be simple or complicated, but I can't really tell because all the examples I've found so far were for very different use cases. I haven't found any basic examples like this. Pointers are welcome.