function make_edges({ id }) {
const books = df.filter(
aq.escape(
(d) =>
op.replace(d.character, "http://www.wikidata.org/entity/", "") == id
)
);
const relations = df
.semijoin(books, "book")
.filter(
aq.escape(
(d) =>
op.replace(d.character, "http://www.wikidata.org/entity/", "") != id
)
)
.groupby("character")
.count({ as: "size" })
.derive({
source: aq.escape(id),
target: (d) =>
op.replace(d.character, "http://www.wikidata.org/entity/", "")
})
.derive({
id: aq.escape((d) => [d.source, d.target].sort().join("-"))
})
.select(["id", "source", "target", "size"]);
return relations.objects();
}