Upsert On Facet?

Hi there,
Is it possible to create an @upsert directive on a facet key?

I am using DQL and I have a many-to-many relationship between say Users and Cars. A user can have many cars and a car can be owned by many users.

More importantly, there’s an edge attribute (facet) between a user and a car called “token”.

An anonymous user presenting a token should retrieve exactly one car that belongs to that user.

Therefore, I must ensure that a token can never be created twice. We don’t want to give the wrong car to the wrong user.

However, when running a concurrent transaction that creates a new car and adds a token to it, trying to upsert on the token facet does not abort the transaction.

Is it possible to upsert on a facet so that we make sure to never create the same facet value twice?

Here’s what I’m doing:

  1. Create a new transaction
  2. Look up a car by token to see if it already exists
  3. If the token exists, error out, otherwise create the car.
  4. Commit the transaction, check if the transaction is aborted to guard against concurrent requests.

Currently, if I run the 4 steps above in parallel a few times, none of the transactions are aborted and I end up with duplicate tokens.

Happy to provide queries and reproduction as well.

Thanks!

Hey! Sorry for the late reply. Just notice it.

No, it isn’t possible. Facets aren’t first-class citizen.

Instead of using the Upsert Procedure, why not Upsert Block instead? https://dgraph.io/docs/mutations/upsert-block/#sidebar

Continuing

Instead of using Facets to hold such important information. Rather than this, I would create a specific entity and set my Graph Model around it - it would be an intermediate node between the user and the object(the car). As this entity is a first-class citizen, now you could do anything you want.

Cheers.

1 Like