Aran,

it seems that MERGE doesn't take a write lock by default, only when it didn't 
find anything in the first place and has to create it.

Can you try the following instead.

"Removal of a non-existing property causes a write lock on the node". So if we 
do that on the head-node it should actually work.


> MERGE (headNode:HEAD {list:"mylist"})
         REMOVE headNode._lock_
> WITH headNode
> MATCH (headNode)-[old:LINK]->after
> DELETE old
> CREATE headNode-[:LINK]->(newNode:LINKNODE { number : {nodeNumber} 
> })-[:LINK]->after


Am 11.02.2014 um 11:15 schrieb Aran Mulholland <[email protected]>:

> Anyone got any more ideas on how to do this?
> 
> 
> On Tue, Feb 11, 2014 at 3:01 PM, Aran Mulholland <[email protected]> 
> wrote:
> I have placed this question on stack overflow here:
> 
> http://stackoverflow.com/questions/21692829/neo4j-how-do-you-do-parallel-insertion-into-a-linked-list-via-cypher-over-rest
> 
> 
> 
> On Mon, Feb 10, 2014 at 11:40 PM, Aran Mulholland <[email protected]> 
> wrote:
> thanks for your help, sorry for not being clearer.
> 
> I create the constraint then if I run
> 
> MERGE (headNode:HEAD {list:"mylist"})-[:LINK]->headNode
> 
> I get Error: org.neo4j.cypher.PatternException: MERGE needs at least some 
> part of the pattern to already be known. Please provide values for one of: 
> headNode, headNode
> 
> So I change it to:
> 
> MERGE (headNode:HEAD {list:"mylist"}) 
> WITH headNode 
> MERGE headNode-[:LINK]->(headNode)
> 
> Then run the query:
> 
> MERGE (headNode:HEAD {list:"mylist"})
> WITH headNode
> MATCH (headNode)-[old:LINK]->after
> DELETE old
> CREATE headNode-[:LINK]->(newNode:LINKNODE { number : {nodeNumber} 
> })-[:LINK]->after
> 
> Then I get Error: Relationship 391112 not found
> 
> I have been doing this test work in a node.js project. (so I can test adding 
> multiple nodes in parallel) 
> If it helps, the source code is here 
> https://github.com/aranm/neo4j-linked-list
> The relevant file is here 
> https://github.com/aranm/neo4j-linked-list/blob/master/tests/parallelInsertionTest.js
> 
> When I change line 40 from 
> 
> async.map(nodesToInsert, function(item, callback) --inserting in parallel
> 
> to
> 
> async.mapSeries(nodesToInsert, function(item, callback) --inserting in series
> 
> then all is well, it works when we are not hitting the db at the same time. 
> But as soon as we introduce the parallel stuff all goes south.
> 
> 
> On Mon, Feb 10, 2014 at 11:13 PM, Michael Hunger 
> <[email protected]> wrote:
> You would also use MERGE for the initial creation
> 
> What doesn't work? Did you create the constraint?
> 
> Am 10.02.2014 um 12:49 schrieb Aran Mulholland <[email protected]>:
> 
>> Just to make it absolutely clear, are you saying when creating the initial 
>> node I do:
>> 
>> MERGE (headNode:HEAD {list:"mylist"})
> CREATE (headNode)-[:LINK]->(headNode)
>> 
>> But when inserting I do:
>> 
>> MERGE (headNode:HEAD {list:"mylist"})
>> WITH headNode                                     //had to add this line, 
>> cause I got an error WITHout it :)
>> MATCH (headNode)-[old:LINK]->after 
>> DELETE old
>> CREATE headNode-[:LINK]->(newNode:LINKNODE { number : {nodeNumber} 
>> })-[:LINK]->after
>> 
>> Sorry for the re-clarification (I'm feeling a little dense here). The reason 
>> I am asking is that it doesn't work, so I must have mis-understood you 
>> somewhere.
>> 
>> 
>> 
>> 
>> On Mon, Feb 10, 2014 at 10:30 PM, Michael Hunger 
>> <[email protected]> wrote:
>> Only with unique constraints, merge takes a global lock on the label + 
>> property.
>> 
>> Michael
>> 
>> Am 10.02.2014 um 12:17 schrieb Aran Mulholland <[email protected]>:
>> 
>>> Why do you need the unique constraint?
>>> 
>>> 
>>> On Mon, Feb 10, 2014 at 9:52 PM, Michael Hunger 
>>> <[email protected]> wrote:
>>> I think you have to change it to use merge which takes a schema index lock.
>>> 
>>> ie.
>>> 
>>> create constraint on (h:HEAD) assert h.list is unique;
>>> 
>>>> MERGE (headNode:HEAD {list:"mylist"})
>>>    MATCH (headNode)-[old:LINK]->after
>>>> DELETE old
>>>> CREATE headNode-[:LINK]->(newNode:LINKNODE { number : {nodeNumber} 
>>>> })-[:LINK]->after
>>> 
>>> 
>>> 
>>> HTH
>>> 
>>> Michael
>>> 
>>> Am 10.02.2014 um 11:30 schrieb Aran Mulholland <[email protected]>:
>>> 
>>>> I've got some real headaches inserting into linked lists.
>>>> 
>>>> If I create a node as such:
>>>> 
>>>> CREATE (headNode:HEAD)-[:LINK]->(headNode)
>>>> 
>>>> then insert like so 
>>>> 
>>>> MATCH (headNode:HEAD)-[old:LINK]->after
>>>> DELETE old
>>>> CREATE headNode-[:LINK]->(newNode:LINKNODE { number : {nodeNumber} 
>>>> })-[:LINK]->after
>>>> 
>>>> then everything is fine and dandy. But when I try to run the insertion 
>>>> code in parallel, then I get some real issues. I either get an error like 
>>>> "Relationship 325457 not found" or I get two or more lists coming off the 
>>>> headNode. The first error I can deal with as I can rerun the query, the 
>>>> second is totally unacceptable as my other queries get very messed up 
>>>> results.
>>>> 
>>>> I am writing for a twitter like service and am using the linked lists so I 
>>>> can have a news feed. There is a high possibility that the list will need 
>>>> to be added to by more than one user at once, and this chance will grow 
>>>> the more users the system has.
>>>> 
>>>> What I want to be able to do is put a lock around the insertion so that 
>>>> this does not happen.
>>>> 
>>>> How can I better craft my queries so that parallel insertion via cypher 
>>>> over REST is sustainable?
>>>> 
>>>> -- 
>>>> You received this message because you are subscribed to the Google Groups 
>>>> "Neo4j" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>>> email to [email protected].
>>>> For more options, visit https://groups.google.com/groups/opt_out.
>>> 
>>> 
>>> -- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "Neo4j" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email to [email protected].
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>> 
>>> 
>>> -- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "Neo4j" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email to [email protected].
>>> For more options, visit https://groups.google.com/groups/opt_out.
>> 
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Neo4j" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> For more options, visit https://groups.google.com/groups/opt_out.
>> 
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Neo4j" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> For more options, visit https://groups.google.com/groups/opt_out.
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Neo4j" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.
> 
> 
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Neo4j" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.

-- 
You received this message because you are subscribed to the Google Groups 
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to