
Common endpoint patterns
Query endpoint — graph traversal, returns nodes:
return Q().StartAt("Customer", req.CustomerId)
.Out("HasTicket").Take(50).Emit("N");
Search endpoint — permission-aware search with scope:
var search = SearchRequest.For(req.Query);
search.BeforeTypesFacet = new(["Ticket"]);
search.TargetUIDs = Q().StartAt("Product", req.Sku).In("ForProduct")
.AsUIDEnumerable().ToArray();
return (await Graph.CreateSearchAsUserAsync(search, CurrentUser, ct)).Take(20).Emit("N");
RAG endpoint — retrieve, format, generate:
var hits = (await Graph.CreateSearchAsUserAsync(search, CurrentUser, ct)).Take(8).ToArray();
var prompt = BuildPrompt(userQuery, hits.Select(n => Graph.GetIndexedText(n.UID, 4000)));
var answer = await Graph.CallChatModelAsync(prompt, ct);
return new { answer, citations = hits.Select(n => n.UID) };
Action endpoint — validate, check permissions, mutate:
var ticket = Node.FromKey("Ticket", req.TicketId);
if (!await Graph.CanUserSeeAsync(ticket, CurrentUser)) return NotFound();
Graph.Link(ticket, assignee, "AssignedTo");
await Graph.CommitPendingAsync();
return new { ok = true };