Can I SET a map in Neo4j Cypher without overwriting existing properties












0















I have a map say



car: {make: toyota, color: blue, model: camry} 


and I have a node Car with the property



make: toyota


Now I want to add the properties in the map car to my node Car.



However,



MATCH (n:Car {make:'toyota'}) 
SET n +=car
RETURN n;


will overwrite the make property on my node.



Is there a way I can avoid it doing this?



The use case is when make is the key property for the node I wouldn't want it to be accidentally changed and of course I wouldn't want to trow an error either.










share|improve this question

























  • Of Interest: Mutate specific properties using a map and +=

    – Guy Coder
    Nov 20 '18 at 16:42
















0















I have a map say



car: {make: toyota, color: blue, model: camry} 


and I have a node Car with the property



make: toyota


Now I want to add the properties in the map car to my node Car.



However,



MATCH (n:Car {make:'toyota'}) 
SET n +=car
RETURN n;


will overwrite the make property on my node.



Is there a way I can avoid it doing this?



The use case is when make is the key property for the node I wouldn't want it to be accidentally changed and of course I wouldn't want to trow an error either.










share|improve this question

























  • Of Interest: Mutate specific properties using a map and +=

    – Guy Coder
    Nov 20 '18 at 16:42














0












0








0








I have a map say



car: {make: toyota, color: blue, model: camry} 


and I have a node Car with the property



make: toyota


Now I want to add the properties in the map car to my node Car.



However,



MATCH (n:Car {make:'toyota'}) 
SET n +=car
RETURN n;


will overwrite the make property on my node.



Is there a way I can avoid it doing this?



The use case is when make is the key property for the node I wouldn't want it to be accidentally changed and of course I wouldn't want to trow an error either.










share|improve this question
















I have a map say



car: {make: toyota, color: blue, model: camry} 


and I have a node Car with the property



make: toyota


Now I want to add the properties in the map car to my node Car.



However,



MATCH (n:Car {make:'toyota'}) 
SET n +=car
RETURN n;


will overwrite the make property on my node.



Is there a way I can avoid it doing this?



The use case is when make is the key property for the node I wouldn't want it to be accidentally changed and of course I wouldn't want to trow an error either.







neo4j cypher






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 20 '18 at 16:32









Guy Coder

15.2k43983




15.2k43983










asked Nov 20 '18 at 16:27









MichaelEMichaelE

243113




243113













  • Of Interest: Mutate specific properties using a map and +=

    – Guy Coder
    Nov 20 '18 at 16:42



















  • Of Interest: Mutate specific properties using a map and +=

    – Guy Coder
    Nov 20 '18 at 16:42

















Of Interest: Mutate specific properties using a map and +=

– Guy Coder
Nov 20 '18 at 16:42





Of Interest: Mutate specific properties using a map and +=

– Guy Coder
Nov 20 '18 at 16:42












2 Answers
2






active

oldest

votes


















0














If you try to do this in one query, you will have to make one WHERE clause that catches all of the properties that are NULL. From that you would need to use a WITH clause to pass on those records and use another WHERE clause to select just the records missing one property. The problem is getting back to the records from the first WHERE clause. That may be possible but if so I don't know how to do that with Cypher.



Using multiple queries for each property this is easily done by adding an IS NULL to the WHERE clause.



To demonstrate this a set of records with different combinations of properties set and missing are created.



CREATE (:Car {make: "toyota", color: "red", model: "prius", car_id: 01} )
CREATE (:Car {make: "toyota", color: "red", car_id: 02} )
CREATE (:Car {make: "toyota", model: "prius", car_id: 03} )
CREATE (:Car {make: "toyota", car_id: 04} );


To see what was created



MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

╒════════╤═════════╤═════════╤══════════╤═══════════╕
│"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
╞════════╪═════════╪═════════╪══════════╪═══════════╡
│"toyota"│"prius" │"red" │1 │["Car"] │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│null │"red" │2 │["Car"] │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│"prius" │null │3 │["Car"] │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│null │null │4 │["Car"] │
└────────┴─────────┴─────────┴──────────┴───────────┘


To update just the color property



MATCH (c:Car {make:"toyota"}) 
WHERE c.color IS NULL
SET c += {color: "blue"}
RETURN c;


and to see what changed



MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

╒════════╤═════════╤═════════╤══════════╤═══════════╕
│"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
╞════════╪═════════╪═════════╪══════════╪═══════════╡
│"toyota"│"prius" │"red" │1 │["Car"] │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│null │"red" │2 │["Car"] │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│"prius" │"blue" │3 │["Car"] │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│null │"blue" │4 │["Car"] │
└────────┴─────────┴─────────┴──────────┴───────────┘


Notice that just the cars with no color property are updated.



Doing the same for model



MATCH (m:Car {make:"toyota"}) 
WHERE m.model IS NULL
SET m += {model: "camry"}
RETURN m;

MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

╒════════╤═════════╤═════════╤══════════╤═══════════╕
│"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
╞════════╪═════════╪═════════╪══════════╪═══════════╡
│"toyota"│"prius" │"red" │1 │["Car"] │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│"camry" │"red" │2 │["Car"] │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│"prius" │"blue" │3 │["Car"] │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│"camry" │"blue" │4 │["Car"] │
└────────┴─────────┴─────────┴──────────┴───────────┘





share|improve this answer































    0














    You can use apoc.map.clean to remove certain keys and values from a map:



    SET c += apoc.map.clean(car, ['make'],)






    share|improve this answer
























    • So this would leave the car property [make] undisturbed? basically is the apoc removing 'make' from the map before executing the SET?

      – MichaelE
      Nov 20 '18 at 18:26











    • Yes. If you want to remove all existing keys from the map (so that the update operation only adds new properties and doesn't overwrite existing properties) you can supply the keys on that node as the keys to remove from the map: SET c += apoc.map.clean(car, keys(c), )

      – InverseFalcon
      Nov 21 '18 at 9:49











    • I will test these

      – MichaelE
      Nov 21 '18 at 22:01











    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53397349%2fcan-i-set-a-map-in-neo4j-cypher-without-overwriting-existing-properties%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    If you try to do this in one query, you will have to make one WHERE clause that catches all of the properties that are NULL. From that you would need to use a WITH clause to pass on those records and use another WHERE clause to select just the records missing one property. The problem is getting back to the records from the first WHERE clause. That may be possible but if so I don't know how to do that with Cypher.



    Using multiple queries for each property this is easily done by adding an IS NULL to the WHERE clause.



    To demonstrate this a set of records with different combinations of properties set and missing are created.



    CREATE (:Car {make: "toyota", color: "red", model: "prius", car_id: 01} )
    CREATE (:Car {make: "toyota", color: "red", car_id: 02} )
    CREATE (:Car {make: "toyota", model: "prius", car_id: 03} )
    CREATE (:Car {make: "toyota", car_id: 04} );


    To see what was created



    MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

    ╒════════╤═════════╤═════════╤══════════╤═══════════╕
    │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
    ╞════════╪═════════╪═════════╪══════════╪═══════════╡
    │"toyota"│"prius" │"red" │1 │["Car"] │
    ├────────┼─────────┼─────────┼──────────┼───────────┤
    │"toyota"│null │"red" │2 │["Car"] │
    ├────────┼─────────┼─────────┼──────────┼───────────┤
    │"toyota"│"prius" │null │3 │["Car"] │
    ├────────┼─────────┼─────────┼──────────┼───────────┤
    │"toyota"│null │null │4 │["Car"] │
    └────────┴─────────┴─────────┴──────────┴───────────┘


    To update just the color property



    MATCH (c:Car {make:"toyota"}) 
    WHERE c.color IS NULL
    SET c += {color: "blue"}
    RETURN c;


    and to see what changed



    MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

    ╒════════╤═════════╤═════════╤══════════╤═══════════╕
    │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
    ╞════════╪═════════╪═════════╪══════════╪═══════════╡
    │"toyota"│"prius" │"red" │1 │["Car"] │
    ├────────┼─────────┼─────────┼──────────┼───────────┤
    │"toyota"│null │"red" │2 │["Car"] │
    ├────────┼─────────┼─────────┼──────────┼───────────┤
    │"toyota"│"prius" │"blue" │3 │["Car"] │
    ├────────┼─────────┼─────────┼──────────┼───────────┤
    │"toyota"│null │"blue" │4 │["Car"] │
    └────────┴─────────┴─────────┴──────────┴───────────┘


    Notice that just the cars with no color property are updated.



    Doing the same for model



    MATCH (m:Car {make:"toyota"}) 
    WHERE m.model IS NULL
    SET m += {model: "camry"}
    RETURN m;

    MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

    ╒════════╤═════════╤═════════╤══════════╤═══════════╕
    │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
    ╞════════╪═════════╪═════════╪══════════╪═══════════╡
    │"toyota"│"prius" │"red" │1 │["Car"] │
    ├────────┼─────────┼─────────┼──────────┼───────────┤
    │"toyota"│"camry" │"red" │2 │["Car"] │
    ├────────┼─────────┼─────────┼──────────┼───────────┤
    │"toyota"│"prius" │"blue" │3 │["Car"] │
    ├────────┼─────────┼─────────┼──────────┼───────────┤
    │"toyota"│"camry" │"blue" │4 │["Car"] │
    └────────┴─────────┴─────────┴──────────┴───────────┘





    share|improve this answer




























      0














      If you try to do this in one query, you will have to make one WHERE clause that catches all of the properties that are NULL. From that you would need to use a WITH clause to pass on those records and use another WHERE clause to select just the records missing one property. The problem is getting back to the records from the first WHERE clause. That may be possible but if so I don't know how to do that with Cypher.



      Using multiple queries for each property this is easily done by adding an IS NULL to the WHERE clause.



      To demonstrate this a set of records with different combinations of properties set and missing are created.



      CREATE (:Car {make: "toyota", color: "red", model: "prius", car_id: 01} )
      CREATE (:Car {make: "toyota", color: "red", car_id: 02} )
      CREATE (:Car {make: "toyota", model: "prius", car_id: 03} )
      CREATE (:Car {make: "toyota", car_id: 04} );


      To see what was created



      MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

      ╒════════╤═════════╤═════════╤══════════╤═══════════╕
      │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
      ╞════════╪═════════╪═════════╪══════════╪═══════════╡
      │"toyota"│"prius" │"red" │1 │["Car"] │
      ├────────┼─────────┼─────────┼──────────┼───────────┤
      │"toyota"│null │"red" │2 │["Car"] │
      ├────────┼─────────┼─────────┼──────────┼───────────┤
      │"toyota"│"prius" │null │3 │["Car"] │
      ├────────┼─────────┼─────────┼──────────┼───────────┤
      │"toyota"│null │null │4 │["Car"] │
      └────────┴─────────┴─────────┴──────────┴───────────┘


      To update just the color property



      MATCH (c:Car {make:"toyota"}) 
      WHERE c.color IS NULL
      SET c += {color: "blue"}
      RETURN c;


      and to see what changed



      MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

      ╒════════╤═════════╤═════════╤══════════╤═══════════╕
      │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
      ╞════════╪═════════╪═════════╪══════════╪═══════════╡
      │"toyota"│"prius" │"red" │1 │["Car"] │
      ├────────┼─────────┼─────────┼──────────┼───────────┤
      │"toyota"│null │"red" │2 │["Car"] │
      ├────────┼─────────┼─────────┼──────────┼───────────┤
      │"toyota"│"prius" │"blue" │3 │["Car"] │
      ├────────┼─────────┼─────────┼──────────┼───────────┤
      │"toyota"│null │"blue" │4 │["Car"] │
      └────────┴─────────┴─────────┴──────────┴───────────┘


      Notice that just the cars with no color property are updated.



      Doing the same for model



      MATCH (m:Car {make:"toyota"}) 
      WHERE m.model IS NULL
      SET m += {model: "camry"}
      RETURN m;

      MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

      ╒════════╤═════════╤═════════╤══════════╤═══════════╕
      │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
      ╞════════╪═════════╪═════════╪══════════╪═══════════╡
      │"toyota"│"prius" │"red" │1 │["Car"] │
      ├────────┼─────────┼─────────┼──────────┼───────────┤
      │"toyota"│"camry" │"red" │2 │["Car"] │
      ├────────┼─────────┼─────────┼──────────┼───────────┤
      │"toyota"│"prius" │"blue" │3 │["Car"] │
      ├────────┼─────────┼─────────┼──────────┼───────────┤
      │"toyota"│"camry" │"blue" │4 │["Car"] │
      └────────┴─────────┴─────────┴──────────┴───────────┘





      share|improve this answer


























        0












        0








        0







        If you try to do this in one query, you will have to make one WHERE clause that catches all of the properties that are NULL. From that you would need to use a WITH clause to pass on those records and use another WHERE clause to select just the records missing one property. The problem is getting back to the records from the first WHERE clause. That may be possible but if so I don't know how to do that with Cypher.



        Using multiple queries for each property this is easily done by adding an IS NULL to the WHERE clause.



        To demonstrate this a set of records with different combinations of properties set and missing are created.



        CREATE (:Car {make: "toyota", color: "red", model: "prius", car_id: 01} )
        CREATE (:Car {make: "toyota", color: "red", car_id: 02} )
        CREATE (:Car {make: "toyota", model: "prius", car_id: 03} )
        CREATE (:Car {make: "toyota", car_id: 04} );


        To see what was created



        MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

        ╒════════╤═════════╤═════════╤══════════╤═══════════╕
        │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
        ╞════════╪═════════╪═════════╪══════════╪═══════════╡
        │"toyota"│"prius" │"red" │1 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│null │"red" │2 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│"prius" │null │3 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│null │null │4 │["Car"] │
        └────────┴─────────┴─────────┴──────────┴───────────┘


        To update just the color property



        MATCH (c:Car {make:"toyota"}) 
        WHERE c.color IS NULL
        SET c += {color: "blue"}
        RETURN c;


        and to see what changed



        MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

        ╒════════╤═════════╤═════════╤══════════╤═══════════╕
        │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
        ╞════════╪═════════╪═════════╪══════════╪═══════════╡
        │"toyota"│"prius" │"red" │1 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│null │"red" │2 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│"prius" │"blue" │3 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│null │"blue" │4 │["Car"] │
        └────────┴─────────┴─────────┴──────────┴───────────┘


        Notice that just the cars with no color property are updated.



        Doing the same for model



        MATCH (m:Car {make:"toyota"}) 
        WHERE m.model IS NULL
        SET m += {model: "camry"}
        RETURN m;

        MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

        ╒════════╤═════════╤═════════╤══════════╤═══════════╕
        │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
        ╞════════╪═════════╪═════════╪══════════╪═══════════╡
        │"toyota"│"prius" │"red" │1 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│"camry" │"red" │2 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│"prius" │"blue" │3 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│"camry" │"blue" │4 │["Car"] │
        └────────┴─────────┴─────────┴──────────┴───────────┘





        share|improve this answer













        If you try to do this in one query, you will have to make one WHERE clause that catches all of the properties that are NULL. From that you would need to use a WITH clause to pass on those records and use another WHERE clause to select just the records missing one property. The problem is getting back to the records from the first WHERE clause. That may be possible but if so I don't know how to do that with Cypher.



        Using multiple queries for each property this is easily done by adding an IS NULL to the WHERE clause.



        To demonstrate this a set of records with different combinations of properties set and missing are created.



        CREATE (:Car {make: "toyota", color: "red", model: "prius", car_id: 01} )
        CREATE (:Car {make: "toyota", color: "red", car_id: 02} )
        CREATE (:Car {make: "toyota", model: "prius", car_id: 03} )
        CREATE (:Car {make: "toyota", car_id: 04} );


        To see what was created



        MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

        ╒════════╤═════════╤═════════╤══════════╤═══════════╕
        │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
        ╞════════╪═════════╪═════════╪══════════╪═══════════╡
        │"toyota"│"prius" │"red" │1 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│null │"red" │2 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│"prius" │null │3 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│null │null │4 │["Car"] │
        └────────┴─────────┴─────────┴──────────┴───────────┘


        To update just the color property



        MATCH (c:Car {make:"toyota"}) 
        WHERE c.color IS NULL
        SET c += {color: "blue"}
        RETURN c;


        and to see what changed



        MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

        ╒════════╤═════════╤═════════╤══════════╤═══════════╕
        │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
        ╞════════╪═════════╪═════════╪══════════╪═══════════╡
        │"toyota"│"prius" │"red" │1 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│null │"red" │2 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│"prius" │"blue" │3 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│null │"blue" │4 │["Car"] │
        └────────┴─────────┴─────────┴──────────┴───────────┘


        Notice that just the cars with no color property are updated.



        Doing the same for model



        MATCH (m:Car {make:"toyota"}) 
        WHERE m.model IS NULL
        SET m += {model: "camry"}
        RETURN m;

        MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

        ╒════════╤═════════╤═════════╤══════════╤═══════════╕
        │"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
        ╞════════╪═════════╪═════════╪══════════╪═══════════╡
        │"toyota"│"prius" │"red" │1 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│"camry" │"red" │2 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│"prius" │"blue" │3 │["Car"] │
        ├────────┼─────────┼─────────┼──────────┼───────────┤
        │"toyota"│"camry" │"blue" │4 │["Car"] │
        └────────┴─────────┴─────────┴──────────┴───────────┘






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 20 '18 at 17:21









        Guy CoderGuy Coder

        15.2k43983




        15.2k43983

























            0














            You can use apoc.map.clean to remove certain keys and values from a map:



            SET c += apoc.map.clean(car, ['make'],)






            share|improve this answer
























            • So this would leave the car property [make] undisturbed? basically is the apoc removing 'make' from the map before executing the SET?

              – MichaelE
              Nov 20 '18 at 18:26











            • Yes. If you want to remove all existing keys from the map (so that the update operation only adds new properties and doesn't overwrite existing properties) you can supply the keys on that node as the keys to remove from the map: SET c += apoc.map.clean(car, keys(c), )

              – InverseFalcon
              Nov 21 '18 at 9:49











            • I will test these

              – MichaelE
              Nov 21 '18 at 22:01
















            0














            You can use apoc.map.clean to remove certain keys and values from a map:



            SET c += apoc.map.clean(car, ['make'],)






            share|improve this answer
























            • So this would leave the car property [make] undisturbed? basically is the apoc removing 'make' from the map before executing the SET?

              – MichaelE
              Nov 20 '18 at 18:26











            • Yes. If you want to remove all existing keys from the map (so that the update operation only adds new properties and doesn't overwrite existing properties) you can supply the keys on that node as the keys to remove from the map: SET c += apoc.map.clean(car, keys(c), )

              – InverseFalcon
              Nov 21 '18 at 9:49











            • I will test these

              – MichaelE
              Nov 21 '18 at 22:01














            0












            0








            0







            You can use apoc.map.clean to remove certain keys and values from a map:



            SET c += apoc.map.clean(car, ['make'],)






            share|improve this answer













            You can use apoc.map.clean to remove certain keys and values from a map:



            SET c += apoc.map.clean(car, ['make'],)







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Nov 20 '18 at 18:03









            Michael HungerMichael Hunger

            36.4k33761




            36.4k33761













            • So this would leave the car property [make] undisturbed? basically is the apoc removing 'make' from the map before executing the SET?

              – MichaelE
              Nov 20 '18 at 18:26











            • Yes. If you want to remove all existing keys from the map (so that the update operation only adds new properties and doesn't overwrite existing properties) you can supply the keys on that node as the keys to remove from the map: SET c += apoc.map.clean(car, keys(c), )

              – InverseFalcon
              Nov 21 '18 at 9:49











            • I will test these

              – MichaelE
              Nov 21 '18 at 22:01



















            • So this would leave the car property [make] undisturbed? basically is the apoc removing 'make' from the map before executing the SET?

              – MichaelE
              Nov 20 '18 at 18:26











            • Yes. If you want to remove all existing keys from the map (so that the update operation only adds new properties and doesn't overwrite existing properties) you can supply the keys on that node as the keys to remove from the map: SET c += apoc.map.clean(car, keys(c), )

              – InverseFalcon
              Nov 21 '18 at 9:49











            • I will test these

              – MichaelE
              Nov 21 '18 at 22:01

















            So this would leave the car property [make] undisturbed? basically is the apoc removing 'make' from the map before executing the SET?

            – MichaelE
            Nov 20 '18 at 18:26





            So this would leave the car property [make] undisturbed? basically is the apoc removing 'make' from the map before executing the SET?

            – MichaelE
            Nov 20 '18 at 18:26













            Yes. If you want to remove all existing keys from the map (so that the update operation only adds new properties and doesn't overwrite existing properties) you can supply the keys on that node as the keys to remove from the map: SET c += apoc.map.clean(car, keys(c), )

            – InverseFalcon
            Nov 21 '18 at 9:49





            Yes. If you want to remove all existing keys from the map (so that the update operation only adds new properties and doesn't overwrite existing properties) you can supply the keys on that node as the keys to remove from the map: SET c += apoc.map.clean(car, keys(c), )

            – InverseFalcon
            Nov 21 '18 at 9:49













            I will test these

            – MichaelE
            Nov 21 '18 at 22:01





            I will test these

            – MichaelE
            Nov 21 '18 at 22:01


















            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53397349%2fcan-i-set-a-map-in-neo4j-cypher-without-overwriting-existing-properties%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            MongoDB - Not Authorized To Execute Command

            How to fix TextFormField cause rebuild widget in Flutter

            in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith