---
title: "Chapter 2: The grey book | SurrealDB University"
description: "Follow along with interactive SurrealDB lessons featuring hands-on exercises, code examples, and step-by-step instructions."
url: https://surrealdb.com/learn/book/chapter-02
---

![Course content preview](https://surrealdb.com/assets/static/part-2-front.CUmtYr7Y.avif)

[Back to Courses](https://surrealdb.com/learn)

Course chapters

[Aeon's Surreal Renaissance](https://surrealdb.com/learn/book) [Prologue - your story](https://surrealdb.com/learn/book/welcome/prologue) [Chapter 1: One year later](https://surrealdb.com/learn/book/chapter-01) [Chapter 2: The grey book](https://surrealdb.com/learn/book/chapter-02) [Chapter 3: Gone in an instant](https://surrealdb.com/learn/book/chapter-03) [Chapter 4: The security door](https://surrealdb.com/learn/book/chapter-04) [Chapter 5: A long road to travel](https://surrealdb.com/learn/book/chapter-05) [Chapter 6: Inspiration from the past](https://surrealdb.com/learn/book/chapter-06) [Chapter 7: A rude surprise](https://surrealdb.com/learn/book/chapter-07) [Chapter 8: A nice surprise](https://surrealdb.com/learn/book/chapter-08) [Chapter 9: A peaceful interlude](https://surrealdb.com/learn/book/chapter-09) [Chapter 10: The ancient world begins to reappear](https://surrealdb.com/learn/book/chapter-10) [Chapter 11: A growing map](https://surrealdb.com/learn/book/chapter-11) [Chapter 12: The wires return](https://surrealdb.com/learn/book/chapter-12) [Chapter 13: The outsiders](https://surrealdb.com/learn/book/chapter-13) [Chapter 14: Learning from each other](https://surrealdb.com/learn/book/chapter-14) [Chapter 15: France saves the day again](https://surrealdb.com/learn/book/chapter-15) [Chapter 16: Keeping knowledge free](https://surrealdb.com/learn/book/chapter-16) [Chapter 17: Landevin's journey](https://surrealdb.com/learn/book/chapter-17) [Chapter 18: Restoring civilisation](https://surrealdb.com/learn/book/chapter-18) [What now?](https://surrealdb.com/learn/book/chapter-18/what-happens-now) [Chapter 19: Aeons later](https://surrealdb.com/learn/book/chapter-19) [Chapter 20: Take three](https://surrealdb.com/learn/book/chapter-20) [Chapter 21: Breaking out](https://surrealdb.com/learn/book/chapter-21) [Congratulations](https://surrealdb.com/learn/book/the-end) [FAQ (no spoilers)](https://surrealdb.com/learn/book/faq-no-spoilers) [FAQ (contains spoilers)](https://surrealdb.com/learn/book/faq-with-spoilers)

# Chapter 2: The grey book

**Time elapsed: 8h**

> *It's the afternoon of your first day with SurrealDB. You are having tea outside with a grey book that you noticed earlier this morning.*
>
> ‎
>
> *There are a lot of books in the library that you don't understand. This doesn't concern you for the most part, as you will probably understand them later and have other things to do in the meantime.*
>
> ‎
>
> *But this grey book in your hand is certainly a mystery! It has no author, publisher, date, or anything else, just a simple title: THE FORMULA.*
>
> ‎
>
> *Inside the cover of the book is a sheet of paper on which someone has scribbled a few words telling you to "calculate and track the output of the formula".*
>
> ‎
>
> *How you wish you could! But the rest of the book is hundreds and hundreds of pages of mathematical signs and equations that have something to do with a "humanity hope ratio", whatever that is. How are you supposed to calculate and track something that you don't even understand?*
>
> ‎
>
> *Well, perhaps one day! And learning to use this SurrealDB database should eventually provide the answers. It's time to go back inside and continue learning how to use it.*

## Record IDs

We learned in the last chapter that all record IDs in SurrealDB must be unique, are randomly generated by default, but that we can set a record ID ourselves. Let's get into some of the details on how record IDs work.

### Standard record IDs

Record IDs have the format `<table_name>:<id>`. Let's try creating some records with our own IDs to see what happens.

This query will return a `person` with the ID `aeon`.

```
CREATE person:aeon;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
    {
        id: person:aeon
    }
]
```

Next is a `book` with the ID `aeon`, created after a `person` with the ID `aeon`. This is not a duplicate, because the record ID is "book:aeon", not "aeon":

```
CREATE book:aeon;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
    {
        id: book:aeon
    }
]
```

This next query tries to create one more `person` with the ID `aeon`. This ID already exists, so SurrealDB refuses to create it.

```
CREATE person:aeon;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
'Database record `person:aeon` already exists'
```

At this point you might be curious about what else you can create a record ID with. How about something fancy like Egyptian hieroglyphs? Let's see if we can create a record with an ID set to `𓅃`, the hieroglyph for a falcon.

```
CREATE bird:𓅃;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
"Parse error: Invalid token `𓅃`
 --> [1:13]
  |
1 | CREATE bird:𓅃;
  |             ^"
```

Even Greek or common accented characters won't work here:

```
CREATE person:Αἰών;CREATE person:éon;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
"Parse error: Invalid token `Α`
 --> [1:13]
  |
1 | CREATE person:Αἰών;
  |             ^"
```

So it looks like the answer is...no?

But don't despair, because the answer is actually yes! Let's learn some more about record IDs to find out how.

### Other record ID formats

Record IDs in SurrealDB are extremely flexible and allow for a lot of possibilities.

A regular record ID can contain unaccented letters, numbers, and underscores. A record ID that isn't composed of one of these three elements won't parse.

If you need to use accented or other characters, you can enclose it in backticks. SurrealDB will then save them internally as strings and enclose such IDs between `` ` `` to mark them as complex characters.

Knowing this, we can create record IDs with any string we like. Here is a record ID with the French character ç:

```
CREATE building:`façade`;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
    {
        id: building:`façade`
    }
]
```

The ID can be over multiple lines too.

```
CREATE building:`faç   ad   e`;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
  {
    id: building:`faç
ad
e`
  }
]
```

The same rules apply to the table name part of the record ID, which can also be enclosed in backticks.

```
CREATE `Gebäude`:`façade`;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
  {
    id: `Gebäude`:`façade`
  }
]
```

The Egyptian hieroglyph 𓅃 that we tried before will now work, and so will emojis.

```
CREATE     bird:`𓅃`,    artist:`👉**BRUCE DICKINSON**👈`,    `𓊖`:`𓏠𓈖𓄤𓆑𓂋𓉴𓊖`;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
  {
    id: bird:`𓅃`
  },
  {
    id: artist:`👉**BRUCE DICKINSON**👈`
  },
  {
    id: `𓊖`:`𓏠𓈖𓄤𓆑𓂋𓉴𓊖`
  }
]
```

Bonus points if you can read the last record - it's the name of a real place!

### How record IDs are stored

Now it's time for a small quiz. The next two records created have almost the same input, but only the second record ID is enclosed in `` ` `` backticks. Why do you think that is the case?

```
CREATE   person:9223372036854775807,   person:9223372036854775808;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
  {
    id: person:9223372036854775807
  },
  {
    id: person:`9223372036854775808`
  }
]
```

If you're not sure, here is another hint. We can see the same behaviour for these two records as well when the same numbers are negative.

```
CREATE   person:-9223372036854775808,   person:-9223372036854775809;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
  {
    id: person:-9223372036854775808
  },
  {
    id: person:`-9223372036854775809`
  }
]
```

It looks like only the second records are being stored as strings! There is a good reason for this.

If you create a record with an ID that is an integer, SurrealDB will also store it as an integer if possible because they require less space to store and are thus more efficient. But the numbers 9223372036854775808 and -9223372036854775809 are beyond the upper and lower limits of a 64-bit signed integer, so the only choice at this point is to store them as a string.

We can demonstrate that SurrealDB tries to choose an integer if possible when it sees a number in an ID by trying to create two records that look like they have a different ID, but actually do not. The second query won't work, because the number `00005` just means 5.

```
CREATE person:5;CREATE person:00005;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
-------- Query 1 --------

[
  {
    id: person:5
  }
]

-------- Query 2 --------

'Database record `person:5` already exists'
```

So if you truly want to create a separate 'person:00005', you can enclose it in backticks to force SurrealDB to turn the 00005 into a string.

```
CREATE person:`00005`;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
    {
        id: person:`00005`
    }
]
```

You can also use `SET` to set a record's `id`. In this case, SurrealDB will combine the table name with the `id` that you chose to set. If you set the `id` to a string, it will show up inside backticks.

```
CREATE bird   SET id = "𓅃";CREATE person SET id = 0;CREATE person SET id = "0";
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
-------- Query --------

[
  {
    id: bird:`𓅃`
  }
]

-------- Query --------

[
  {
    id: person:0
  }
]

-------- Query --------

[
  {
    id: person:`0`
  }
]
```

## Creating multiple records with CREATE

The `CREATE` statement is usually used to create a single record, but there are some methods to create more than one at the same time if you prefer.

As we saw in the last chapter, you can separate the table or record names with commas to create more than one record at a time.

```
CREATE townsperson, townsperson, person SET name = "Just a person";
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
  {
    id: townsperson:n40vh685pw6mr5ynvtpf,
    name: 'Just a person'
  },
  {
    id: townsperson:ihsorngt74vqf69vyju0,
    name: 'Just a person'
  },
  {
    id: person:tlm5i8p839v67uknnrb1,
    name: 'Just a person'
  }
]
```

`CREATE` also has a special parallel bar (`||`) syntax used to create more than one record. Inside these bars, you can specify the number of records to create. You can also combine this syntax with the comma method we learned just above.

```
// Three `townsperson` records with a random idCREATE |townsperson:3| SET name = "Just a person";// Two `person` and three `townsperson` records with a random idCREATE |person:2|, |townsperson:3| SET name = "Just a person";
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

If you don't want to see the output for a statement, you can follow it with `RETURN NONE`. This will be especially useful if you need to create a large number of records, such as through the following statement which creates 1000 `person` records. Nobody has time to read all that, so we'll use `RETURN NONE`.

```
CREATE |person:1000| RETURN NONE;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[]
```

You can also use SurrealDB's range operator (`..`) to create more than one record with that ID. This query will not return `townsperson` records with random IDs; this time, they will show up as `townsperson:1, townsperson:2`, all the way up to `townsperson:10`.

As with other programming languages, adding an `=` will make this into an inclusive range (1 to 10, including 10), while not having the `=` will make it exclusive (1 up to 10, but not including 10).

```
-- Inclusive: creates from 1 to 10CREATE |townsperson:1..=10|;-- Exclusive: creates from 11 to 19CREATE |townsperson:11..20|;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

This range syntax is useful in a lot of other places that we will encounter throughout this book. In the meantime, let's move back to statements that return a single record and the ways to make working with them a little more convenient.

## Working with single records

We learned in the last chapter that a query will return an array by default, even if only a single item is returned. As [the documentation for the SELECT statement](https://surrealdb.com/docs/reference/query-language/statements/select) says:

> By default, SurrealDB returns an array of JSON-like objects called records instead of a tabular structure of rows and columns.

This happens with even the simplest of queries as well when you use statements like `SELECT` and `CREATE`. `RETURN` is the only exception here as it simply returns the value that follows it. Compare the following queries:

```
RETURN 9;SELECT * FROM 9;// You can use [] if you want to emulate the SELECT outputRETURN [ 9 ];
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
-------- Query --------

9

-------- Query --------

[
  9
]

-------- Query --------

[
  9
]
```

But sometimes you will find it more convenient to only return a single record, instead of an array that contains a single record. Let's take a look.

### ONLY

For a query that SurrealDB can guarantee will only return one record, you can add the `ONLY` keyword before the record ID to return just the result instead of an array of results.

```
CREATE person:1 SET name = 'Aeon';SELECT name FROM person:1;SELECT name FROM ONLY person:1;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
-------- Query --------

[
  {
    id: person:1,
    name: 'Aeon'
  }
]

-------- Query --------

[
  {
    name: 'Aeon'
  }
]

-------- Query --------

{
  name: 'Aeon'
}
```

You can insert the `ONLY` keyword into other statements too, like `CREATE`.

```
CREATE person:1;CREATE ONLY person:2;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
-------- Query --------

[
  {
    id: person:1
  }
]

-------- Query --------

{
  id: person:2
}
```

### ONLY with LIMIT 1

Another way to work with a single record at a time is with the `LIMIT` keyword, followed by the number 1. As the name suggests, you can use the LIMIT keyword to limit the number of results from a query.

While using `LIMIT 1` on its own will still return an array of results (with a single record inside), SurrealDB is smart enough in this case to realise that only a single record can be returned, and thus will let you use the `ONLY` keyword. For example:

```
CREATE person:1, person:2;SELECT * FROM ONLY person LIMIT 1;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
{
    id: person:1
}
```

But you can't trick it into trying to return a single record with `ONLY` when more than one record might be returned.

```
SELECT * FROM ONLY person LIMIT 2;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
"Expected a single result output when using the ONLY keyword"
```

When more than one record is returned using `LIMIT`, their order will be determined by their ID. So if you create the following three `person` records, and then query with `SELECT * FROM person LIMIT 2`, you will see that `person:1` and `person:2` are returned first.

```
CREATE person:2;CREATE person:1;CREATE person:3;SELECT * FROM person LIMIT 2;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

```surql
[
    {
        id: person:1
    },
    {
        id: person:2
    }
]
```

Here again we see an example of automatic ordering in SurrealDB. This behaviour makes sense, because being able to order by `id` is one of the main reasons to choose your own `id` instead of using the random `id` that SurrealDB creates by default.

There are even more interesting ways to create your own IDs in SurrealDB, but let's save those for the next chapter so that the new information is not too overwhelming.

### VALUE

SurrealDB has another keyword called `VALUE` that is a bit similar to `ONLY` in the sense that it produces a simpler output, but instead of returning a single result, `VALUE` returns only the value(s) that follow a field name - without the field name itself.

```
CREATE person:1, person:2, person:3;SELECT id FROM person:1;SELECT VALUE id FROM person:1;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
-------- Query 1 --------
[{ id: person:1 }]

-------- Query 2 --------
[person:1]
```

And since `VALUE` works to only return values, and `ONLY` to only return a single record, you can also combine the two. This will result in just a single value from one field of a single record.

```
CREATE person:1, person:2, person:3;SELECT VALUE id FROM ONLY person:1;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
person:1
```

## Tip: Use SurrealDB Studio's Designer view to visualise your database

We haven't done anything serious with SurrealDB just yet, but we do know that even a simple query like `CREATE person` will create a table called `person` that did not exist before, because you can see this declaration when you type `INFO FOR DB`:

```
CREATE person;INFO FOR DB;
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
  {
      id: person:s5s12n4fxh3svxe56gwf
  }
]

{
  accesses: {},
  analyzers: {},
  functions: {},
  models: {},
  params: {},
  tables: {
          person: 'DEFINE TABLE person TYPE ANY SCHEMALESS PERMISSIONS NONE'
  },
  users: {}
}
```

As you create more and more tables, you might prefer to have a visual view of the tables and their makeup. You can do that by clicking on the `Designer` tab in SurrealDB Studio.

Try opening up a new Sandbox database inside SurrealDB Studio and typing the following simple queries:

```surql
CREATE person SET name = 'Billy';
CREATE cat;
CREATE dog SET age = 2;
```

Once you do that, the Designer view will show you three tables.

However, the tables won't show you very much information at all! They will be nothing more than three tables with no defined fields, and have nothing to do with each other. But that is precisely the point, because at the moment we have three tables that are SCHEMALESS, and no fields have been defined - despite the fact that we have given `name = 'Billy'` to our `person` record and `age = 2` to our `dog` record. SurrealDB Studio has no further information from us at this point about how we intend to use the `person` and `dog` tables.

If you click on one of the tables in SurrealDB Studio, however, the magic begins. Doing so lets you start defining these tables as you see fit, including schemas, permissions, and so on.

We will start to learn about the details of creating a schema in Chapter 5, and Chapter 14 is devoted to all of the ins and outs of SurrealDB Studio. In the meantime, if you are already looking to define a schema for your database and aren't very familiar with SurrealDB yet, this is the easiest way to start.

## Comments

We'll finish up the chapter with something extremely easy: commenting out your code. SurrealDB lets you comment out code in quite a few ways:

- With `--`, `//`, or `#` to comment out everything to the right on a single line.
- With `/*` followed by `*/` to comment out everything in between, even over multpile lines.

A single example should be enough to demonstrate all of these methods:

```
CREATE person SET    name = "Aeon", -- Aeon is the main character    town = "Toria", // Toria is the main town in the story    age = "Unknown", # Unknown but pretty young, probably 20-ish    mood = /* */ "Pretty good",    other_notes /*    You can write comments    over multiple lines too    this way    */ = "Nothing at the moment";
```

![Surrealist Icon](https://surrealdb.com/assets/static/fdfe2c20f5941d5e.D0guSOhZ.webp) Run Query

Response

```surql
[
  {
    age: 'Unknown',
    id: person:5nza6ujqb2j0akeh3ggd,
    mood: 'Pretty good',
    name: 'Aeon',
    other_notes: 'Nothing at the moment',
    town: 'Toria'
  }
]
```

**Practice time** 

###### **1. What will the output be of the statement `CREATE person:00001`?**

**Answer** 

The `00001` that follows `person` will be interpreted as an integer, so you will see a `person` record with the id `person:1`.

```surql
[
  {
    id: person:1
  }
]
```

###### **2. What about the statement `CREATE person:00001000000000000000000000`?**

**Answer** 

Since the number is far too large to be interpreted as an integer, the entire input will be turned into a string. The output will also include `` ` `` backticks to show that this is a string, not an integer.

```surql
[
  {
    id: person:`00001000000000000000000000`
  }
]
```

###### 3. How would you create three `person` records with ids 1, 2, and 3?

**Answer** 

There are quite a few ways to do this. Here are three of them:

```surql
// Three separate CREATE statements
CREATE person:1;
CREATE person:2;
CREATE person:3;

// A single statement with each record separated by a comma
CREATE person:1, person:2, person:3;

// Range syntax from 1 to 3
CREATE |person:1..=3|;
```

###### 4. Can I create a record entirely made of emojis?

**Answer** 

Yes you can, just remember to wrap everything that needs to be a field name inside backticks. Here is a record for Halloween day showing the candy that has been received:

```surql
/**
[test]

[[test.results]]
value = "[{ id: `📅`:`🎃`, "👜": ['🍬', '🍭', '🍓', '🍡', '🍬', '🍭'] }]"

*/

CREATE `📅`:`🎃` SET `👜` = ["🍬", "🍭", "🍓", "🍡", "🍬", "🍭"];
```

###### 5. How would you create a single record but only return the record itself instead of an array with the record inside?

**Answer** 

You can add the `ONLY` statement after `CREATE`, and that will do the job.

```surql
CREATE ONLY person:aeon SET name = "Aeon";
```

Previous

Chapter 1: One year later

[Previous](https://surrealdb.com/learn/book/chapter-01)

Next lesson

Chapter 3: Gone in an instant

[Next lesson](https://surrealdb.com/learn/book/chapter-03)

```json
{"@context":"https://schema.org","@type":"Course","name":"Aeon's Surreal Renaissance","description":"Welcome to Aeon's Surreal Renaissance! This book takes you on a journey through the ins and outs of SurrealDB as you follow an immersive story crafted to make learning a new database feel as enjoyable as sitting back and watching your favourite movie.","url":"https://surrealdb.com/learn/book","inLanguage":"en","isAccessibleForFree":true,"provider":{"@type":"Organization","name":"SurrealDB","url":"https://surrealdb.com"},"hasPart":[{"@type":"LearningResource","name":"Aeon's Surreal Renaissance","url":"https://surrealdb.com/learn/book"},{"@type":"LearningResource","name":"Prologue - your story","url":"https://surrealdb.com/learn/book/welcome/prologue"},{"@type":"LearningResource","name":"Chapter 1: One year later","url":"https://surrealdb.com/learn/book/chapter-01"},{"@type":"LearningResource","name":"Chapter 2: The grey book","url":"https://surrealdb.com/learn/book/chapter-02"},{"@type":"LearningResource","name":"Chapter 3: Gone in an instant","url":"https://surrealdb.com/learn/book/chapter-03"},{"@type":"LearningResource","name":"Chapter 4: The security door","url":"https://surrealdb.com/learn/book/chapter-04"},{"@type":"LearningResource","name":"Chapter 5: A long road to travel","url":"https://surrealdb.com/learn/book/chapter-05"},{"@type":"LearningResource","name":"Chapter 6: Inspiration from the past","url":"https://surrealdb.com/learn/book/chapter-06"},{"@type":"LearningResource","name":"Chapter 7: A rude surprise","url":"https://surrealdb.com/learn/book/chapter-07"},{"@type":"LearningResource","name":"Chapter 8: A nice surprise","url":"https://surrealdb.com/learn/book/chapter-08"},{"@type":"LearningResource","name":"Chapter 9: A peaceful interlude","url":"https://surrealdb.com/learn/book/chapter-09"},{"@type":"LearningResource","name":"Chapter 10: The ancient world begins to reappear","url":"https://surrealdb.com/learn/book/chapter-10"},{"@type":"LearningResource","name":"Chapter 11: A growing map","url":"https://surrealdb.com/learn/book/chapter-11"},{"@type":"LearningResource","name":"Chapter 12: The wires return","url":"https://surrealdb.com/learn/book/chapter-12"},{"@type":"LearningResource","name":"Chapter 13: The outsiders","url":"https://surrealdb.com/learn/book/chapter-13"},{"@type":"LearningResource","name":"Chapter 14: Learning from each other","url":"https://surrealdb.com/learn/book/chapter-14"},{"@type":"LearningResource","name":"Chapter 15: France saves the day again","url":"https://surrealdb.com/learn/book/chapter-15"},{"@type":"LearningResource","name":"Chapter 16: Keeping knowledge free","url":"https://surrealdb.com/learn/book/chapter-16"},{"@type":"LearningResource","name":"Chapter 17: Landevin's journey","url":"https://surrealdb.com/learn/book/chapter-17"},{"@type":"LearningResource","name":"Chapter 18: Restoring civilisation","url":"https://surrealdb.com/learn/book/chapter-18"},{"@type":"LearningResource","name":"What now?","url":"https://surrealdb.com/learn/book/chapter-18/what-happens-now"},{"@type":"LearningResource","name":"Chapter 19: Aeons later","url":"https://surrealdb.com/learn/book/chapter-19"},{"@type":"LearningResource","name":"Chapter 20: Take three","url":"https://surrealdb.com/learn/book/chapter-20"},{"@type":"LearningResource","name":"Chapter 21: Breaking out","url":"https://surrealdb.com/learn/book/chapter-21"},{"@type":"LearningResource","name":"Congratulations","url":"https://surrealdb.com/learn/book/the-end"},{"@type":"LearningResource","name":"FAQ (no spoilers)","url":"https://surrealdb.com/learn/book/faq-no-spoilers"},{"@type":"LearningResource","name":"FAQ (contains spoilers)","url":"https://surrealdb.com/learn/book/faq-with-spoilers"}]}
```

```json
{"@context":"https://schema.org","@type":"LearningResource","name":"Chapter 2: The grey book","description":"The grey book","url":"https://surrealdb.com/learn/book/chapter-02","learningResourceType":"lesson","isPartOf":{"@type":"Course","name":"Aeon's Surreal Renaissance","url":"https://surrealdb.com/learn/book"},"position":4}
```

```json
{"@context":"https://schema.org","@type":"Organization","name":"SurrealDB","url":"https://surrealdb.com","logo":"https://surrealdb.com/assets/static/logo.BG7_TG2b.svg","description":"SurrealDB is the unified data layer for AI. A multi-model database for documents, graphs, vectors, and time-series.","foundingDate":"2022","hasCertification":[{"@type":"Certification","name":"SOC 2 Type 2"},{"@type":"Certification","name":"GDPR"},{"@type":"Certification","name":"Cyber Essentials Plus"},{"@type":"Certification","name":"ISO 27001"}],"owns":[{"@type":"SoftwareApplication","name":"SurrealDB","url":"https://surrealdb.com/surrealdb"},{"@type":"SoftwareApplication","name":"Agent Memory","url":"https://surrealdb.com/agent-memory"}],"knowsAbout":["multi-model databases","document databases","graph databases","vector search","time-series databases","SurrealQL","Agent Memory","real-time databases","embedded databases","context layer","graph ontology","distributed database","knowledge graphs","distributed transaction protocols","highly-scalable databases"],"sameAs":["https://www.wikidata.org/wiki/Q124316308","https://github.com/surrealdb/surrealdb","https://twitter.com/surrealdb","https://www.youtube.com/@surrealdb","https://www.linkedin.com/company/surrealdb","https://discord.gg/surrealdb","https://www.reddit.com/r/surrealdb","https://www.instagram.com/surrealdb","https://medium.com/surrealdb","https://dev.to/surrealdb"]}
```

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://surrealdb.com"},{"@type":"ListItem","position":2,"name":"Learn","item":"https://surrealdb.com/learn"},{"@type":"ListItem","position":3,"name":"Chapter 02","item":"https://surrealdb.com/learn/book/chapter-02"}]}
```
