{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "f0fa70a8-7e25-4045-b3f3-871f9db3c4fa", "metadata": {}, "source": [ "# ISWC 2026 Demo Submission Examples\n", "\n", "Below are code cells corresponding to the figures of the ISWC 2026 short paper submission, plus additional details." ] }, { "attachments": {}, "cell_type": "markdown", "id": "85aeaaea-1eb7-45fd-b60b-7e5771d72a51", "metadata": {}, "source": [ "## Figure 1\n", "\n", "Parsing a sort subsumption + similarity" ] }, { "cell_type": "code", "execution_count": 1, "id": "76d7d0e0-d953-40f3-b5bf-fe7fedf6c2b6", "metadata": { "tags": [] }, "outputs": [], "source": [ "from fosf.parsers import parse_taxonomy\n", "sim_tax_str = \"\"\"\n", "# Subsumption declarations\n", "institution, person < top .\n", "research_center < institution .\n", "university < research_center .\n", "researcher, lecturer, teacher < person .\n", "professor < researcher, lecturer .\n", "# Similarity declarations\n", "teacher ~ lecturer = 0.5 .\"\"\"\n", "sim_tax = parse_taxonomy(sim_tax_str)" ] }, { "cell_type": "markdown", "id": "a80840d7-043b-42bd-98e4-808fb14129ce", "metadata": {}, "source": [ "Drawing the fuzzy taxonomy" ] }, { "cell_type": "code", "execution_count": 2, "id": "b2290ccc-1f0d-4f14-9e5b-1dbc651adaf3", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from fosf.utils.draw import notebook_display as display\n", "display(sim_tax, drop=\"bot\", similarity=sim_tax._similarity)" ] }, { "cell_type": "markdown", "id": "79258c5c-ff8e-440e-a04a-11d6e1e5148d", "metadata": {}, "source": [ "Computing GLBs" ] }, { "cell_type": "code", "execution_count": 3, "id": "fc5cd212-204c-4754-84d9-7deb672343a4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Sort('professor')" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from fosf.syntax import Sort\n", "researcher, teacher = Sort(\"researcher\"), Sort(\"teacher\")\n", "sim_tax.glb(researcher, teacher)" ] }, { "cell_type": "markdown", "id": "54ce9e3d-b29b-48a3-b62a-ac8046a1ad23", "metadata": {}, "source": [ "Checking sort subsumption" ] }, { "cell_type": "code", "execution_count": 4, "id": "78073933-2061-491d-84ce-b9b53d80b5b5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "professor = Sort(\"professor\")\n", "sim_tax.is_subsort(professor, teacher)" ] }, { "cell_type": "markdown", "id": "6fde9024-b5c9-48c1-a382-bd0cdff8faa3", "metadata": {}, "source": [ "Computing subsumption degrees" ] }, { "cell_type": "code", "execution_count": 5, "id": "7acd78da-3f0d-4a9e-9956-b37128e7549f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(0.5)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sim_tax.degree(professor, teacher)" ] }, { "cell_type": "code", "execution_count": 6, "id": "572a39b2-a6bf-48e7-ac4a-9b85decd3c35", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "person = Sort(\"person\")\n", "sim_tax.degree(professor, person)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "6deb0bab-b2e7-4e29-8898-f545c6259800", "metadata": {}, "source": [ "## Figure 2\n", "\n", "Parsing an OSF term and normalizing it according to the sort subsumption + similarity." ] }, { "cell_type": "code", "execution_count": 7, "id": "179aa3ba-3b97-4b82-b12d-de74815b0c0f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X0 : person(teach_at -> X1 : research_center, research_at -> X1)\n" ] } ], "source": [ "from fosf.parsers import parse_term\n", "from fosf.reasoning import normalize_term\n", "# Normalizing an OSF term according to subsumption + similarity only\n", "t_str = \"X0:person(teach_at -> X1:institution, research_at -> X1:research_center)\"\n", "t = parse_term(t_str)\n", "print(normalize_term(t, sim_tax))\n", "# Output: X0 : person(teach_at -> X1 : research_center, research_at -> X1)" ] }, { "cell_type": "code", "execution_count": 8, "id": "f86691e2-e458-41a6-b309-4bb16f2478ea", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(normalize_term(t, sim_tax))" ] }, { "cell_type": "markdown", "id": "b7c53e1d-c93d-4cd5-9117-e140557cf882", "metadata": {}, "source": [ "## Figure 3" ] }, { "cell_type": "code", "execution_count": 9, "id": "88fd9c08-fbe2-4e6a-980c-b71679bcd139", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.5 X0 : professor(teach_at -> X1 : university, research_at -> X1)\n" ] } ], "source": [ "from fosf.parsers import parse_theory\n", "theory_str = sim_tax_str + \"\"\"\n", "professor := Yp:professor(research_at -> Y1:university) .\n", "domain(teach_at) := teacher .\n", "domain(research_at) := researcher .\"\"\"\n", "theory = parse_theory(theory_str, ensure_closed=True)\n", "# Normalizing an OSF term also according to the theory\n", "nt, degree = normalize_term(t, sim_tax, theory, return_degree=True)\n", "print(degree, nt)\n", "# Output: 0.5 X0 : professor(teach_at -> X1 : university, research_at -> X1)" ] }, { "cell_type": "code", "execution_count": 10, "id": "00f53dd7-b589-486f-8ed4-c4746fea7b5d", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(nt)" ] }, { "cell_type": "markdown", "id": "b7ca278f-1b29-4dc3-858f-1267bc07d680", "metadata": {}, "source": [ "The satisfaction degree of `nt` with respect to the OSF theory:" ] }, { "cell_type": "code", "execution_count": 11, "id": "3d91fefd-bbed-435a-bd98-8cf86da6b24b", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.5\n" ] } ], "source": [ "print(degree)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "eab70f6e-0cf6-499b-8281-2e1a70f02386", "metadata": {}, "source": [ "## Figure 4\n", "\n", "The initial term $t$:" ] }, { "cell_type": "code", "execution_count": 12, "id": "43979281-23e6-44b2-bd5e-4093eacffc87", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X0 : person(\n", " teach_at -> X1 : institution\n", " research_at -> X1 : research_center\n", ")\n", "\n" ] } ], "source": [ "t.pretty_print()" ] }, { "cell_type": "markdown", "id": "a462fa4d-906c-4db3-8c54-f77ac9480208", "metadata": {}, "source": [ "Its SPARQL translation of Figure 4(a):" ] }, { "cell_type": "code", "execution_count": 13, "id": "a4ba3fd4-4dca-47b9-b26c-bf2b9b903f81", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "prefix : \n", "SELECT DISTINCT ?X0 WHERE {\n", " ?X0 rdf:type :person .\n", " ?X0 :teach_at ?X1 .\n", " ?X1 rdf:type :institution .\n", " ?X0 :research_at ?X1 .\n", " ?X1 rdf:type :research_center .\n", "}\n" ] } ], "source": [ "print(t.to_sparql())" ] }, { "cell_type": "markdown", "id": "08b56562-a599-4ced-ae25-78dfc742e30f", "metadata": {}, "source": [ "The term $t$ after normalization according to the OSF theory:" ] }, { "cell_type": "code", "execution_count": 14, "id": "93fce567-f2fc-4677-b665-02f09730c05d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X0 : professor(\n", " teach_at -> X1 : university\n", " research_at -> X1\n", ")\n", "\n" ] } ], "source": [ "nt.pretty_print()" ] }, { "cell_type": "markdown", "id": "dd58d501-479a-4694-8cf6-d2b82118efd2", "metadata": {}, "source": [ "Its SPARQL translation of Figure 4(b):" ] }, { "cell_type": "code", "execution_count": 15, "id": "f50f01f9-7be4-4079-bde8-41918a5f2362", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "prefix : \n", "SELECT DISTINCT ?X0 WHERE {\n", " ?X0 rdf:type :professor .\n", " ?X0 :teach_at ?X1 .\n", " ?X1 rdf:type :university .\n", " ?X0 :research_at ?X1 .\n", "}\n" ] } ], "source": [ "nt_sparql = nt.to_sparql()\n", "print(nt_sparql)" ] }, { "cell_type": "markdown", "id": "2101f88e-2c50-480c-b959-aa4b361709e8", "metadata": {}, "source": [ "**Extra: normalization and translation without the similarity relation**" ] }, { "cell_type": "code", "execution_count": 16, "id": "3e65ab84-95cd-40ff-bc6f-1ffd0e705dd1", "metadata": { "tags": [] }, "outputs": [], "source": [ "# Same theory minus the similarity teacher ~ lecturer\n", "no_sim_theory_str = \"\"\"\n", "institution, person < top .\n", "research_center < institution .\n", "university < research_center .\n", "researcher, lecturer, teacher < person .\n", "professor < researcher, lecturer .\n", "\n", "professor := Yp:professor(research_at -> Y1:university).\n", "domain(teach_at) := teacher . domain(research_at) := researcher .\n", "\"\"\"\n", "no_sim_theory = parse_theory(no_sim_theory_str)" ] }, { "cell_type": "markdown", "id": "308f36fc-5704-4ec3-96e7-aecb8c8a49c6", "metadata": {}, "source": [ "Normalizing $t$ according to this theory:" ] }, { "cell_type": "code", "execution_count": 17, "id": "d9eef2b0-cce4-44f4-965b-ff072a645330", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_FAIL : bot\n", "\n" ] } ], "source": [ "no_sim_nt = normalize_term(t, no_sim_theory.taxonomy, no_sim_theory)\n", "no_sim_nt.pretty_print()" ] }, { "cell_type": "markdown", "id": "0f472135-8df7-4eb3-98b1-c89c38680f54", "metadata": {}, "source": [ "`:bot` is the bottom sort, corresponding to the empty set." ] }, { "cell_type": "markdown", "id": "1ced8c51-93c8-485c-b20d-3ca7ae9aeeb3", "metadata": {}, "source": [ "The SPARQL translation:" ] }, { "cell_type": "code", "execution_count": 18, "id": "0af1e8b1-16f4-47a4-bd4a-097715110802", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "prefix : \n", "SELECT DISTINCT ?_FAIL WHERE {\n", " ?_FAIL rdf:type :bot .\n", "}\n" ] } ], "source": [ "print(no_sim_nt.to_sparql())" ] }, { "attachments": {}, "cell_type": "markdown", "id": "2bffa701-4d96-456f-987c-f9e14f9be826", "metadata": {}, "source": [ "## Query answering\n", "\n", "The generated SPARQL queries can be run on in-memory RDF graphs (via `rdflib`) or remote SPARQL endpoints (via `SPARQLWrapper`)." ] }, { "cell_type": "code", "execution_count": 19, "id": "187c0d65-85da-4e71-8ad0-4b55e31b743f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X0\n", "http://example.org/alice\n", "\n" ] } ], "source": [ "from rdflib import Graph\n", "turtle = \"\"\"@prefix : .\n", ":alice a :professor ; :teach_at :unimib ; :research_at :unimib .\n", ":unimib a :university . \"\"\"\n", "g = Graph().parse(data=turtle)\n", "print(g.query(nt.to_sparql()).serialize(format='csv').decode())" ] }, { "cell_type": "markdown", "id": "3869237e-d738-4fbd-8001-3edecf162034", "metadata": {}, "source": [ "The cell below demonstrates how to send the compiled SPARQL query to a remote endpoint using SPARQLWrapper. If you do not have a SPARQL server running locally at `http://localhost:8890/sparql`, the cell will catch the connection error." ] }, { "cell_type": "code", "execution_count": 20, "id": "bac4c41b-cc7b-437a-87ad-4658c2638982", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\"X0\"\n", "\"http://example.org/alice\"\n", "\n" ] } ], "source": [ "from urllib.error import URLError\n", "from SPARQLWrapper import SPARQLWrapper\n", "\n", "endpoint_url = \"http://localhost:8890/sparql\"\n", "try:\n", " endpoint = SPARQLWrapper(endpoint_url)\n", " endpoint.setQuery(nt.to_sparql())\n", " endpoint.setReturnFormat('csv')\n", " print(endpoint.query().convert().decode())\n", "except (ConnectionRefusedError, URLError):\n", " print(f\"Note: local SPARQL endpoint not running at {endpoint_url}.\")\n", " print(\"To execute this query, start a local triple store or point SPARQLWrapper to a public endpoint.\")" ] } ], "metadata": { "kernelspec": { "display_name": "fosf", "language": "python", "name": "fosf" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.14.6" } }, "nbformat": 4, "nbformat_minor": 5 }