Skip to content

Examples

This repository's layers/ folder holds two example layers, installable from it:

uvx semantic-layers add SynaLinks/semantic-layers --list

sales

Orders and customers: what a customer is, which orders count as sales, revenue, and the customers who bought.

---
name: Customer
description: Every customer who placed at least one order.
keywords: [customer, buyer, client]
---
import tables.Orders.Orders;

@OrderBy(Customer, "customer_id");
Customer(customer_id:) distinct :- Orders(customer_id:);
---
name: DeliveredOrder
description: Orders that reached the customer, the ones that count as sales.
keywords: [delivered, completed, fulfilled, sale]
---
import tables.Orders.Orders;

@OrderBy(DeliveredOrder, "order_id");
DeliveredOrder(order_id:, customer_id:, amount:) :-
  Orders(order_id:, customer_id:, amount:, status: "delivered");
---
name: ActiveCustomer
description: Customers with at least one delivered order.
keywords: [active, engaged, retained]
---
import concepts.Customer.Customer;
import concepts.DeliveredOrder.DeliveredOrder;

@OrderBy(ActiveCustomer, "customer_id");
ActiveCustomer(customer_id:) distinct :-
  Customer(customer_id:), DeliveredOrder(customer_id:);
---
name: Revenue
description: Total amount of delivered orders.
keywords: [revenue, sales, turnover, income]
---
import concepts.DeliveredOrder.DeliveredOrder;

@OrderBy(Revenue, "revenue");
Revenue(revenue? += amount) distinct :- DeliveredOrder(amount:);
---
name: RevenueByCountry
description: Delivered revenue per customer country, largest first.
keywords: [revenue, country, geography, market]
---
import concepts.DeliveredOrder.DeliveredOrder;
import tables.Customers.Customers;

@Assert(RevenueByCountry,
        one_row_per_country: "∀ c r s, RevenueByCountry c r → RevenueByCountry c s → r = s",
        positive:            "∀ c, RevenueByCountry c > 0");
@OrderBy(RevenueByCountry, "revenue", "DESC");
RevenueByCountry(country:, revenue? += amount) distinct :-
  DeliveredOrder(customer_id:, amount:), Customers(customer_id:, country:);
---
name: Orders
description: One row per order, with its customer, status and amount.
keywords: [order, purchase, sale]
---
@OrderBy(Orders, "order_id");
Orders(order_id:, customer_id:, status:, amount:, ordered_at:) :-
  orders(order_id:, customer_id:, status:, amount:, ordered_at:);

support

Support tickets: the open ones, and each agent's workload — a rule built on another rule.

---
name: OpenTickets
description: Tickets still waiting for an answer.
keywords: [open, pending, backlog, unresolved]
---
import tables.Tickets.Tickets;

@OrderBy(OpenTickets, "ticket_id");
OpenTickets(ticket_id:, agent_id:) distinct :- Tickets(ticket_id:, agent_id:, status: "open");
---
name: Workload
description: Open tickets per support agent, busiest first.
keywords: [workload, load, backlog, agent]
---
import rules.OpenTickets.OpenTickets;

@OrderBy(Workload, "open_tickets", "DESC");
Workload(agent_id:, open_tickets? += 1) distinct :- OpenTickets(agent_id:);
---
name: Tickets
description: One row per support ticket, with its status and the agent on it.
keywords: [ticket, case, request, issue]
---
@OrderBy(Tickets, "ticket_id");
Tickets(ticket_id:, status:, agent_id:, opened_at:) :-
  tickets(ticket_id:, status:, agent_id:, opened_at:);