Using link properties

Links can contain properties. Due to how they’re persisted under the hood, link properties have a few additional constraints: they’re always single and optional.

Declaration

Let’s a create a Person.friends link with a strength property corresponding to the strength of the friendship.

  1. type Person {
  2. required property name -> str { constraint exclusive };
  3. multi link friends -> Person {
  4. property strength -> float64;
  5. }
  6. }

Constraints

  1. type Person {
  2. required property name -> str { constraint exclusive };
  3. multi link friends -> Person {
  4. property strength -> float64;
  5. constraint expression on (
  6. __subject__@strength >= 0
  7. );
  8. }
  9. }

Indexes

To index on a link property, you must declare an abstract link and extend it.

  1. abstract link friendship {
  2. property strength -> float64;
  3. index on (__subject__@strength);
  4. }
  5. type Person {
  6. required property name -> str { constraint exclusive };
  7. multi link friends extending friendship -> Person;
  8. }

Inserting

The @strength property is specified in the shape of the select subquery. This is only valid in a subquery inside an insert statement.

  1. insert Person {
  2. name := "Bob",
  3. friends := (
  4. select detached Person {
  5. @strength := 3.14
  6. }
  7. filter .name = "Alice"
  8. )
  9. }

We are using the detached operator to unbind the Person reference from the scope of the insert query.

When doing a nested insert, link properties can be directly included in the inner insert subquery.

  1. insert Person {
  2. name := "Bob",
  3. friends := (
  4. insert Person {
  5. name := "Jane",
  6. @strength := 3.14
  7. }
  8. )
  9. }

Updating

  1. update Person
  2. filter .name = "Bob"
  3. set {
  4. friends += (
  5. select .friends {
  6. @strength := 3.7
  7. }
  8. filter .name = "Alice"
  9. )
  10. };

The example updates the @strength property of Bob’s friends link to Alice to 3.7.

In the context of multi links the += operator works like an an insert/update operator.

To update one or more links in a multi link, you can select from the current linked objects, as the example does. Use a detached selection if you want to insert/update a wider selection of linked objects instead.

Querying

  1. edgedb>
  2. .......
  3. .......
  4. .......
  5. .......
  6. .......
  1. select Person {
  2. friends: {
  3. name,
  4. @strength
  5. }
  6. };
  1. {
  2. default::Person {name: 'Alice', friends: {}},
  3. default::Person {
  4. name: 'Bob',
  5. friends: {
  6. default::Person {name: 'Alice', @strength: 3.7}
  7. }
  8. },
  9. }

See also

Data Model > Links > Link properties

SDL > Properties

DDL > Properties

Introspection > Object Types