Search code examples
neo4jcypherneo4j-apoc

Need to merge multiple json into single json in neo4j using cypher query


I want to merge multiple json into single json in cypher. LocalizationKey is parent node and all languages is his child node.

I want to merge all child node into single json in cypher.

I have return cypher query to fetch the data as expected below

MATCH (key:Key)-[*1]->(languages)
WITH key, collect(languages) as Languages
return apoc.map.setKey( key, 'Languages', Languages ) as LocalizationValue

Expected output:

{
  "localizationKey": "P2P_CM_BasicDetails",
  "Languages": [
    {
      "en_US": "Basic details",
      "cz_CZ": "Základní údaje",
      "de_DE": "Grundlegende Details",
      "en_AU": "Basic Details"
    }
  ]
}

Currently getting result as:

{
  "localizationKey": "P2P_CM_BasicDetails",
  "Languages": [
    {
      "en_US": "Basic details"
    },
    {
      "cz_CZ": "Základní údaje"
    },
    {
      "de_DE": "Grundlegende Details"
    },
    {
      "en_AU": "Basic Details"
    },
  ]
}

Solution

  • This query:

    MATCH (key:Key)-->(lang)
    WITH key, REDUCE(s={}, x IN COLLECT(lang) | apoc.map.merge(s, x)) AS Languages
    RETURN apoc.map.merge(key, {Languages: Languages}) AS LocalizationValue
    

    uses apoc.map.merge to merge maps, and returns a result in the following format (which is what I think you actually want, since it does not make sense for Languages to be a list containing just a single object):

    {
      "localizationKey": "P2P_CM_BasicDetails",
      "Languages": {
        "en_AU": "Basic Details",
        "cz_CZ": "Základní údaje",
        "en_US": "Basic details",
        "de_DE": "Grundlegende Details"
      }
    }