<div id="sigma-container"></div>
import Graph from "graphology";
import forceAtlas2 from "graphology-layout-forceatlas2";
import FA2Layout from "graphology-layout-forceatlas2/worker";
import Sigma from "sigma";
import { registerControls } from "../_controls";
const container = document.getElementById("sigma-container") as HTMLElement;
// Recursively parse a JSON-LD object into graph nodes and edges.
// Each object with @type becomes a node; each property linking to
// another object or value becomes an edge.
function parseJsonLd(item: Record<string, unknown>, graph: Graph): string {
const id = (item["@id"] as string) || (item["@value"] as string) || `${item["@type"] || "blank"}#${globalId}`;
graph.mergeNode(id, { x: Math.random(), y: Math.random(), size: 10, label: id });
for (const [predicate, value] of Object.entries(item)) {
if (predicate.startsWith("@")) continue;
const values = Array.isArray(value) ? value : [value];
for (const v of values) {
if (v === null || v === undefined) continue;
if (typeof v === "object") {
targetId = parseJsonLd(v as Record<string, unknown>, graph);
targetId = `${v}#${globalId}`;
graph.mergeNode(targetId, { x: Math.random(), y: Math.random(), size: 6, label: String(v) });
graph.addDirectedEdge(id, targetId, { label: predicate });
const res = await fetch("/data/pina-colada.jsonld");
const rdf = await res.json();
const graph = new Graph({ type: "directed", multi: true });
const sensibleSettings = forceAtlas2.inferSettings(graph);
const fa2Layout = new FA2Layout(graph, { settings: sensibleSettings });
if (running) fa2Layout.start();
new Sigma(graph, container, {