To lazily create the nodes use MERGE in the first line instead of MATCH

Am 21.02.2014 um 11:30 schrieb Ben Titmarsh <[email protected]>:

> Hi Michael,
> 
> Based on your advice I changed my query to:
> 
> MATCH (fromCard:Card { name: 'Hearts'}),(toCard:Card{ name: 'Spades'}) 
> CREATE UNIQUE (fromCard)-[r:DECK_INCIDENCE]-(toCard) 
> SET r.passCount = coalesce(r.passCount, 0) +1
> 
> I deleted one of the relationships and surely enough which ever order the 
> cards are specified in it updates the relationship.
> 
> However, it doesn't create the nodes 'Hearts' and 'Spades' if they don't yet 
> exist.  I realise that I didn't specify this in my previous post but I need 
> the query to lazily create the nodes too, so in summary I need it to:
> 
> 1) Lazily Create Nodes
> 2) Lazily Create Relationships
> 3) Increment the passCount property on the relationship whether it was just 
> created or preexisted regardless of the direction of the relationship.
> 
> I'll certainly leverage MERGE without arrows when it's released, but in the 
> mean time I'd really like to get something live and working.  Any guidance 
> would be much appreciated!
> 
> Ben.
> 
> On Thursday, February 20, 2014 10:51:16 PM UTC, Michael Hunger wrote:
> MERGE without arrows were added and will be available in the next release.
> 
> Until then try to replace that last merge with CREATE UNIQUE
> 
> Michael
> 
> Am 20.02.2014 um 23:30 schrieb Ben Titmarsh <[email protected]>:
> 
>> I'd bluffed myself into thinking that I'd solved this but actually I hadn't. 
>>  This is my cypher:
>> 
>> MATCH (fromCard:Card { name: {fromCardName}}),(toCard:Card{ name: 
>> {toCardName}})
>> MERGE (fromCard:Card)-[r:DECK_INCIDENCE]->(toCard:Card)
>> SET r.passCount = coalesce(r.passCount, 0) +1
>> 
>> For each pair of cards I end up creating a relationship in both directions, 
>> for example the first time fromCard='HEARTS' and toCard='SPADES', 
>> HEARTS->SPADES is created with passCount 1, then when fromCard='SPADES' and 
>> toCard='HEARTS' SPADES->HEARTS is created with passCount 1.  The desired 
>> behaviour is that there is only one "bidirectional" relationship.  The 
>> direction is really not important, all I'm modelling is the strength of the 
>> relationship i.e. the number of times that this combination of cards is 
>> "passed" (note that I've used Hearts and Spades here purely for explanation, 
>> I in fact have ~20k domain-specific cards)
>> 
>> I tried without the arrow
>> 
>> MATCH (fromCard:Card { name: {fromCardName}}),(toCard:Card{ name: 
>> {toCardName}})
>> MERGE (fromCard:Card)-[r:DECK_INCIDENCE]-(toCard:Card)
>> SET r.passCount = coalesce(r.passCount, 0) +1
>> 
>> but that gives me: Only directed relationships are supported in CREATE, 
>> while MATCH allows to ignore direction.
>> 
>> So I'm stuck here.  It's important that relationships are created lazily, 
>> i.e. the first time a 'pass' is registered, as for may pairs of cards they 
>> will never be related at all.  So how can I use the semantics of a merge to 
>> create a relationship where the property passCount can be incremented (or 
>> coalesced if null) regardless of the direction?
>> 
>> 
>> 
>> On Wednesday, February 12, 2014 12:55:19 PM UTC, Peter Neubauer wrote:
>> Cool Ben. 
>> 
>> G:  neubauer.peter 
>> S:  peter.neubauer 
>> P:  +46 704 106975 
>> L:   http://www.linkedin.com/in/neubauer 
>> T:   @peterneubauer 
>> 
>> Neo4j 2.0.0                                  - (graphs)-[:FOR]->(everyone) 
>> Kids LAN creative party in Malmö  - Kidscraft ICE 
>> 
>> 
>> On Wed, Feb 12, 2014 at 1:45 PM, Ben Titmarsh <[email protected]> wrote: 
>> > Ah my mistake!  Didn't qualify my match with the property that I was 
>> > matching on!  This works: 
>> > 
>> > MATCH (fromCard:Card { name: {fromCardName}}),(toCard:Card{ name: 
>> > {toCardName}}) 
>> > 
>> > MERGE (fromCard:Card)-[r:DECK_INCIDENCE]->(toCard:Card) 
>> > SET r.deckCount = coalesce(r.deckCount, 0) +1 
>> > 
>> > On Wednesday, February 12, 2014 11:56:32 AM UTC, Ben Titmarsh wrote: 
>> >> 
>> >> Hi Guys, 
>> >> 
>> >> I am aware that Neo4J doesn't have a concept of a bidirectional 
>> >> relationship and I believe that's causing me a problem when using MERGE. 
>> >> Here is my Cypher: 
>> >> 
>> >> MATCH (fromCard:Card),(toCard:Card) 
>> >> MERGE (fromCard:Card)-[r:DECK_INCIDENCE]->(toCard:Card) 
>> >> SET r.deckCount = coalesce(r.deckCount, 0) +1 
>> >> 
>> >> So say I have a collection of 4 cards: 
>> >> "Hearts","Diamonds","Clubs","Spades" 
>> >> 
>> >> The first time I create the relationship between Hearts and Diamonds, 
>> >> i.e. 
>> >> Hearts -> Diamonds.  However, the next time the cards are in a different 
>> >> order and when I attempt to MERGE Diamonds -> Hearts a new relationship 
>> >> is 
>> >> created because no relationship exists in that direction.  This is not 
>> >> what 
>> >> I want, I need to increment the deckCount property on the relationship 
>> >> regardless of the direction and don't want to have to manage two 
>> >> relationships per card. 
>> >> 
>> >> I cannot guarantee the order of cards and in essence I need to model a 
>> >> Bidirectional Relationship.  How can I achieve what I need using MERGE? 
>> >> 
>> >> Cheers, 
>> >> Ben. 
>> > 
>> > -- 
>> > 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