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.
type Person {required property name -> str { constraint exclusive };multi link friends -> Person {property strength -> float64;}}
Constraints
type Person {required property name -> str { constraint exclusive };multi link friends -> Person {property strength -> float64;constraint expression on (__subject__@strength >= 0);}}
Indexes
To index on a link property, you must declare an abstract link and extend it.
abstract link friendship {property strength -> float64;index on (__subject__@strength);}type Person {required property name -> str { constraint exclusive };multi link friends extending friendship -> Person;}
Inserting
The @strength property is specified in the shape of the select subquery. This is only valid in a subquery inside an insert statement.
insert Person {name := "Bob",friends := (select detached Person {@strength := 3.14}filter .name = "Alice")}
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.
insert Person {name := "Bob",friends := (insert Person {name := "Jane",@strength := 3.14})}
Updating
update Personfilter .name = "Bob"set {friends += (select .friends {@strength := 3.7}filter .name = "Alice")};
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
edgedb>...................................
select Person {friends: {name,@strength}};
{default::Person {name: 'Alice', friends: {}},default::Person {name: 'Bob',friends: {default::Person {name: 'Alice', @strength: 3.7}}},}
︙
See also |