Inhalt

DGraph - Teil 2: GraphQL Schema und die ersten Schritte

Beim letzten mal haben wir den Server gestartet und unsere ersten Daten gespeichert. Hierzu hatten wir das Ratel Interface von Dgraph genutzt. Wir haben auch einen GraphQl Endpunkt bereitgestellt. Hier erzeugen wir die selben Daten und Verbindungen wie schon zuvor in Ratel. Im Moment können wir mit unseren GraphQL Endpunkt nichts machen, da GraphQL ein Schema benötigt. Hierzu erstellen wir eine Datei namens schema.graphql:

1
2
3
4
5
type Person {
  name: String! @id
  hometown: String
  friend_of: [Person]
}

Die Struktur ist so wie in Teil 1. Zusätzlich definieren wir das Feld name als Pflichtfeld und sorgen dafür, dass die Einträge eindeutig sind. Das erreichen wir mit der Direktive @id. Man könnte natürlich auch ein zusätzliches Feld mit einer eindeutigen Id bestimmen, aber für unser Beispiel soll das erstmal so reichen. Das Feld friend_of wird als Liste vom Typ Person definiert. Das bedeutet, dass hier in Dgraph eine Verbindung zu einer anderen Person erstellt. Nun können wir unser Schema an den admin Endpunkt übermitteln:

1
curl -X POST localhost:8080/admin/schema -d '@schema.graphql'

Dgraph hat unserem Schema deutlich mehr Komplexität hinzugefügt. Wenn wir uns das Schema über einen GraphQL Client ansehen sehen wir grob zusammengefasst folgende Zusätze:

  • definierte Mutation für das erstellen, ändern oder löschen von Personen
  • definierte Queries für das abrufen von Personen
  • verschiedene Input Typen für das filtern und sortieren, sowie Paginierung

Die ersten Datensätze speichern

Da wir das Schema übermittelt haben können wir jetzt mit dem GraphQL Endpunkt interagieren. Im Vergleich zu den RDF N-Quads aus Teil 1 sieht das hinzufügen der gleichen Personen etwas komplexer aus. Außerdem lassen sich die Verknüpfungen über friendof nur teilweise direkt beim erstellen setzen. Wir können zwar für Harry Osborne die beiden anderen Personen im Zuge der friend_of Verknüpfung miterstellen, trotzdem müssen wir anschließend noch Mary Jane Watson aktualisieren. Würde wir bei Mary Jane Watson unseren Peter Parker ebenfalls im Zuge der friend_of Verknüpfung erstellen würde Peter Parker 2x in der Datenbank existieren.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
mutation addPerson {
  addPerson(input:[
    {
      name: "Harry Osborne",
      hometown: "New York",
      friend_of: [
        {
          name: "Mary Jane Watson",
          hometown: "New York",
        },
        {
          name: "Peter Parker",
          hometown: "New York",
        },
        
      ]
    }
  ])
  {
    person{
      name
    }
  },
  updatePerson(input:
    {
      filter: {name: {eq: "Mary Jane Watson"}}
      set: {friend_of: [{name: "Peter Parker"}]}
    },
  ){
    person{
      name
      friend_of{
        name
      }
    }
  }
}

Ein Hinweis noch zur updatePerson Mutation: Wir haben ja in diesem Beispiel die updatePerson Mutation einfach an die addPerson Mutation angehängt. Würden wir jetzt versuchen eine weitere updatePerson Mutation anzuhängen würde GraphQL einen Fehler melden:

Fields updatePerson conflict because they have differing arguments. Use different aliases on the fields to fetch both if this was intentional.

Wenn wir jetzt aber in Zeile 21 und 34 mit Aliases arbeiten gibt es kein Problem.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
mutation addPerson {
  addPerson(input:[
    {
      name: "Harry Osborne",
      hometown: "New York",
    },
    {
      name: "Peter Parker",
      hometown: "New York",
    },
    {
      name: "Mary Jane Watson",
      hometown: "New York",
    },
  ])
  {
    person{
      name
    }
  },
  mary: updatePerson(input:
    {
      filter: {name: {eq: "Mary Jane Watson"}}
      set: {friend_of: [{name: "Peter Parker"}]}
    },
  ){
    person{
      name
      friend_of{
        name
      }
    }
  },
  harry: updatePerson(input:
    {
      filter: {name: {eq: "Harry Osborne"}}
      set: {friend_of: [
        {name: "Mary Jane Watson"},
        {name: "Peter Parker"}
      ]}
    },
  ){
    person{
      name
      friend_of{
        name
      }
    }
  }
}

Wie man sieht kann man mit Dgraph recht schnell mit der Nutzung von GraphQL loslegen. Dabei übernimmt Dgraph so einige Dinge, die man sonst selbst machen müsste.

Beim nächsten Mal schauen wir uns dann die RDF N-Quads noch einmal genauer an 😊