Artists → hasRelease → Release; Release → hasGenre → Genre: How to query amount of releases for genre and show alongside of artist?

What I want to do

I have 3 dgraph.types:

  1. Artist for music artist (blue dots),
  2. Release for a music artist’s releases (green dots), and
  3. Genre to describe the musical genre(s) for each release (pink dots).

These types are connected with 2 types of relations:

  1. <ArtistUid> <hasRelease> <ReleaseUid>: 1:n relation between an artist and its releases
  2. <ReleaseUid> <hasGenre> <GenreUid>: 1:n relation between a release and its genres

This is illustrated here, using the artists “Two Door Cinema Club” and “Amaral” for demo purposes:


The query for this result is:

query {
  ARTISTS_EXTENDED as var(func: eq(dgraph.type, "Artist")) 
  {
    amountReleases as count(hasRelease)
  }
  artists(func: uid(ARTISTS_EXTENDED), orderdesc: val(amountReleases)) 
  {
    name
    amountReleases: val(amountReleases) # works fine
    # TODO: amountReleasesByGenres
    r: hasRelease {
      title: name
      g: hasGenre {
        name
      }
    }
  }
}
JSON Output
{
  "data": {
    "artists": [
      {
        "name": "Amaral",
        "amountReleases": 59,
        "r": [
          {
            "title": "Estrella De Mar / Pájaros En La Cabeza",
            "g": [
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Salto Al Color",
            "g": [
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Nuestro Tiempo",
            "g": [
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Mares Igual Que Tú",
            "g": [
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "AMARAL - SUS ÁLBUMES DE ESTUDIO 1998-2008",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Salta (Acústico - En Directo)",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Un Día Más (Acústico - En Directo)",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "500 Vidas (En Directo)",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Nocturnal (Solar Sessions)",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Superluna (Directo Desde El Planeta Tierra)",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Nocturnal",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Llévame Muy Lejos",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Ratonera",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              },
              {
                "name": "Latin"
              }
            ]
          },
          {
            "title": "1998 ★ 2008 ",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Amaral - 4 Álbumes",
            "g": [
              {
                "name": "Pop"
              },
              {
                "name": "Latin"
              }
            ]
          },
          {
            "title": "Hoy Es El Principio Del Final",
            "g": [
              {
                "name": "Pop"
              },
              {
                "name": "Latin"
              }
            ]
          },
          {
            "title": "Hacia Lo Salvaje",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Hacia Lo Salvaje",
            "g": [
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Antártida",
            "g": [
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "La Barrera Del Sonido",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "El Blues De La Generación Perdida",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Granada",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              },
              {
                "name": "Latin"
              }
            ]
          },
          {
            "title": "Juntos",
            "g": [
              {
                "name": "Pop"
              },
              {
                "name": "Latin"
              }
            ]
          },
          {
            "title": "Kamikaze",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Gato Negro / Dragón Rojo",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              },
              {
                "name": "Latin"
              }
            ]
          },
          {
            "title": "Amaral",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Fundamentales",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              },
              {
                "name": "Latin"
              }
            ]
          },
          {
            "title": "Escapar (Slipping Away)",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Pájaros En La Cabeza",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              },
              {
                "name": "Latin"
              }
            ]
          },
          {
            "title": "El Universo Sobre Mí",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "El Comienzo Del Big Bang Gira 2005",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Revolucion",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Marta, Sebas, Guille Y Los Demás",
            "g": [
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Días De Verano",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Si Tu No Vuelves",
            "g": [
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Fan Single Vol.1",
            "g": [
              {
                "name": "Folk, World, & Country"
              }
            ]
          },
          {
            "title": "Más Allá",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Estrella de Mar",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Les Sentiments Ne Se Réparent Pas",
            "g": [
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Salir Corriendo",
            "g": [
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Te Necesito",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Estrella De Mar",
            "g": [
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Toda La Noche En La Calle",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": " Ni Tu Ni Yo, Te Necesito y Casi",
            "g": [
              {
                "name": "Pop"
              },
              {
                "name": "Latin"
              },
              {
                "name": "Folk, World, & Country"
              }
            ]
          },
          {
            "title": "Moriría Por Vos",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Al Final",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              },
              {
                "name": "Latin"
              }
            ]
          },
          {
            "title": "Sin Ti No Soy Nada",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Una Pequeña Parte Del Mundo",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              },
              {
                "name": "Latin"
              }
            ]
          },
          {
            "title": "Como Hablar",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "A Solas de Sol Música",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              },
              {
                "name": "Folk, World, & Country"
              }
            ]
          },
          {
            "title": "Subamos Al Cielo",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Una Pequeña Parte Del Mundo Sampler 4 Tracks",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Cabecita Loca",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Tardes",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Voy A Acabar Contigo",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Amaral",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              },
              {
                "name": "Folk, World, & Country"
              }
            ]
          },
          {
            "title": "Un Día Más",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "No Sé Qué Hacer Con Mi Vida",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Rosita",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          }
        ]
      },
      {
        "name": "Two Door Cinema Club",
        "amountReleases": 28,
        "r": [
          {
            "title": "Lost Songs (Found)",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Tourist History Remix EP",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "False Alarm",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Talk",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Dirty Air",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Satellite ",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Live From Finsbury Park",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Live At KCRW",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Lavender",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Bad Decisions",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Gameshow",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Are We Ready? (Wreck)",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Handshake",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Next Year",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Changing Of The Seasons",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Beacon",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Sun (Remixes)",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Sleep Alone",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Mar 23, 2011 Big Orange Studios, Austin, TX",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Tourist History",
            "g": [
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Undercover Martyn",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Come Back Home",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "Sampler",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Live In Sydney",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              },
              {
                "name": "Pop"
              }
            ]
          },
          {
            "title": "I Can Talk",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "What You Know",
            "g": [
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Something Good Can Work",
            "g": [
              {
                "name": "Electronic"
              },
              {
                "name": "Rock"
              }
            ]
          },
          {
            "title": "Four Words To Stand On",
            "g": [
              {
                "name": "Rock"
              }
            ]
          }
        ]
      }
    ]
  },
  "extensions": {
    "server_latency": {
      "parsing_ns": 213200,
      "processing_ns": 5908800,
      "encoding_ns": 558300,
      "assign_timestamp_ns": 2002900,
      "total_ns": 9007100
    },
    "txn": {
      "start_ts": 278115
    },
    "metrics": {
      "num_uids": {
        "": 0,
        "_total": 185,
        "dgraph.type": 0,
        "hasGenre": 87,
        "hasRelease": 4,
        "name": 94
      }
    }
  }
}

What I want to do is to query all artists, and for each artist, have a summary of how many releases of a certain genre this artist has. So for example, it would show a way lower amount for “Latin” (pink dot in image above) for the band “Amaral” than for “Rock”, or “Pop”. Any help would be very much appreciated :slight_smile:

Dgraph metadata

dgraph version: v21.03.0

Have you tried Group By?
https://dgraph.io/docs/query-language/groupby/#sidebar

To be honest, I wouldn’t know how to use it in my case. I tried around a bit but without success.

Could you modify the query I posted initially in a way that makes use of @groupby?

If you share a small sample of your dataset I might help. No promises, cuz I feel that it might have an issue due your statement “for each”.