rows { options { physical_type: PHYSICAL_STREAM_TYPE_QUADS max_name_table_size: 128 max_prefix_table_size: 16 max_datatype_table_size: 16 logical_type: LOGICAL_STREAM_TYPE_DATASETS version: 2 } } rows { prefix { value: "https://w3id.org/np/" } } rows { name { value: "RAVy6NkUvgqqbJiyFAOe9if8vLZLI2JseyibYrqkOz2mY" } } rows { namespace { name: "this" value { prefix_id: 1 } } } rows { prefix { value: "https://w3id.org/np/RAVy6NkUvgqqbJiyFAOe9if8vLZLI2JseyibYrqkOz2mY/" } } rows { name { } } rows { namespace { name: "sub" value { prefix_id: 2 } } } rows { prefix { value: "http://www.nanopub.org/nschema#" } } rows { namespace { name: "np" value { prefix_id: 3 name_id: 2 } } } rows { prefix { value: "http://purl.org/dc/terms/" } } rows { namespace { name: "dct" value { prefix_id: 4 name_id: 2 } } } rows { prefix { value: "https://w3id.org/np/o/ntemplate/" } } rows { namespace { name: "nt" value { prefix_id: 5 name_id: 2 } } } rows { prefix { value: "http://purl.org/nanopub/x/" } } rows { namespace { name: "npx" value { prefix_id: 6 name_id: 2 } } } rows { prefix { value: "http://www.w3.org/2001/XMLSchema#" } } rows { namespace { name: "xsd" value { prefix_id: 7 name_id: 2 } } } rows { prefix { value: "http://www.w3.org/2000/01/rdf-schema#" } } rows { namespace { name: "rdfs" value { prefix_id: 8 name_id: 2 } } } rows { prefix { value: "https://orcid.org/" } } rows { namespace { name: "orcid" value { prefix_id: 9 name_id: 2 } } } rows { prefix { value: "http://www.w3.org/ns/prov#" } } rows { namespace { name: "prov" value { prefix_id: 10 name_id: 2 } } } rows { prefix { value: "http://xmlns.com/foaf/0.1/" } } rows { namespace { name: "foaf" value { prefix_id: 11 name_id: 2 } } } rows { name { value: "hasAssertion" } } rows { name { value: "assertion" } } rows { name { value: "Head" } } rows { quad { s_iri { prefix_id: 1 name_id: 1 } p_iri { prefix_id: 3 name_id: 3 } o_iri { prefix_id: 2 } g_iri { } } } rows { name { value: "hasProvenance" } } rows { name { value: "provenance" } } rows { quad { p_iri { prefix_id: 3 } o_iri { prefix_id: 2 } } } rows { name { value: "hasPublicationInfo" } } rows { name { value: "pubinfo" } } rows { quad { p_iri { prefix_id: 3 } o_iri { prefix_id: 2 } } } rows { prefix { value: "http://www.w3.org/1999/02/22-rdf-syntax-ns#" } } rows { name { value: "type" } } rows { name { value: "Nanopublication" } } rows { quad { p_iri { prefix_id: 12 } o_iri { prefix_id: 3 } } } rows { name { value: "get-intro-recommendations" } } rows { name { value: "description" } } rows { quad { s_iri { prefix_id: 2 } p_iri { prefix_id: 4 } o_literal { lex: "Returns recommended introduction actions for a given user, only when the viewer is that user themselves (owner gate ?__CURRENTUSER_multi_iri = ?_user_iri). One row per applicable recommendation, each carrying a ?recommendation text. A \'local introduction\' is defined exactly as the UI\'s isIntroWithLocalKey: SIGNED BY the local key (?__LOCALPUBKEY_multi), DECLARING it, with the local-key declaration\'s location absent or matching ?__SITEURL_multi (nanobench->nanodash); localCount counts those. Branches: (1) create \342\200\224 localCount=0 (directs the user to the \'Create Introduction\' button above); (2) get-approval \342\200\224 localCount=1 and the local key is not approved in the trust repo (carries the intro nanopub); (3) derive \342\200\224 localCount=0 but the user has introductions elsewhere; (4) retract \342\200\224 localCount>1; (5) update-approved \342\200\224 localCount>0, the local key is not approved, but the user has another approved key in the trust repo. No rows for non-owners or logged-out viewers." } g_iri { prefix_id: 2 name_id: 4 } } } rows { name { value: "license" } } rows { prefix { value: "http://www.apache.org/licenses/" } } rows { name { value: "LICENSE-2.0" } } rows { quad { p_iri { prefix_id: 4 name_id: 14 } o_iri { prefix_id: 13 } } } rows { prefix { value: "https://w3id.org/kpxl/grlc/" } } rows { name { value: "grlc-query" } } rows { quad { p_iri { prefix_id: 12 name_id: 10 } o_iri { prefix_id: 14 name_id: 16 } } } rows { name { value: "label" } } rows { quad { p_iri { prefix_id: 8 } o_literal { lex: "Get introduction recommendations" } } } rows { name { value: "endpoint" } } rows { prefix { value: "https://w3id.org/np/l/nanopub-query-1.1/repo/type/" } } rows { name { value: "77757cabf6184c51c20b8b0fe5dc5e1365b7f628448335184ad54319a0affdfc" } } rows { quad { p_iri { prefix_id: 14 } o_iri { prefix_id: 15 } } } rows { name { value: "sparql" } } rows { quad { p_iri { prefix_id: 14 } o_literal { lex: "prefix np: \nprefix npx: \nprefix npa: \n\nselect ?recommendation ?intro_np\nwhere {\n values ?__CURRENTUSER_multi_iri {}\n filter(?_user_iri = ?__CURRENTUSER_multi_iri)\n {\n # (1) create: no local introduction yet\n values ?__LOCALPUBKEY_multi {}\n values ?__SITEURL_multi {}\n filter(bound(?__LOCALPUBKEY_multi))\n {\n select (count(distinct ?lnp) as ?localCount) where {\n values ?__LOCALPUBKEY_multi {}\n values ?__SITEURL_multi {}\n graph npa:graph {\n ?lnp npa:hasValidSignatureForPublicKey ?lsign .\n filter not exists { ?lnpx npx:invalidates ?lnp ; npa:hasValidSignatureForPublicKey ?lsign . }\n ?lnp np:hasAssertion ?la .\n }\n graph ?la { ?lkd npx:declaredBy ?_user_iri ; npx:hasPublicKey ?lpubkey . optional { ?lkd npx:hasKeyLocation ?lloc . } }\n filter(coalesce(str(?lsign) = str(?__LOCALPUBKEY_multi), false))\n filter(coalesce(str(?lpubkey) = str(?__LOCALPUBKEY_multi), false))\n filter(!bound(?lloc) || coalesce(str(?lloc) = str(?__SITEURL_multi), false) || coalesce(replace(str(?lloc), \"nanobench\", \"nanodash\") = str(?__SITEURL_multi), false))\n }\n }\n filter(?localCount = 0)\n bind(\"The local key from this site is not part of an introduction yet. Use the \'Create Introduction\' button above to link it to your identity.\" as ?recommendation)\n } union {\n # (2) get-approval: exactly one local introduction, not yet approved\n values ?__LOCALPUBKEY_multi {}\n values ?__SITEURL_multi {}\n filter(bound(?__LOCALPUBKEY_multi))\n {\n select (count(distinct ?lnp) as ?localCount) (sample(?lnp) as ?localIntroNp) where {\n values ?__LOCALPUBKEY_multi {}\n values ?__SITEURL_multi {}\n graph npa:graph {\n ?lnp npa:hasValidSignatureForPublicKey ?lsign .\n filter not exists { ?lnpx npx:invalidates ?lnp ; npa:hasValidSignatureForPublicKey ?lsign . }\n ?lnp np:hasAssertion ?la .\n }\n graph ?la { ?lkd npx:declaredBy ?_user_iri ; npx:hasPublicKey ?lpubkey . optional { ?lkd npx:hasKeyLocation ?lloc . } }\n filter(coalesce(str(?lsign) = str(?__LOCALPUBKEY_multi), false))\n filter(coalesce(str(?lpubkey) = str(?__LOCALPUBKEY_multi), false))\n filter(!bound(?lloc) || coalesce(str(?lloc) = str(?__SITEURL_multi), false) || coalesce(replace(str(?lloc), \"nanobench\", \"nanodash\") = str(?__SITEURL_multi), false))\n }\n }\n filter(?localCount = 1)\n bind(lcase(sha256(str(?__LOCALPUBKEY_multi))) as ?lpkHash)\n filter not exists {\n service {\n graph npa:graph { npa:thisRepo npa:hasCurrentTrustState ?tg . }\n graph ?tg { ?acct npa:agent ?_user_iri ; npa:pubkey ?lpkHash ; npa:trustStatus npa:loaded . }\n }\n }\n bind(\"Your introduction with the local key is not approved yet. Share it so a maintainer can approve it:\" as ?recommendation)\n bind(?localIntroNp as ?intro_np)\n } union {\n # (3) derive: no local introduction, but the user has introductions elsewhere\n values ?__LOCALPUBKEY_multi {}\n values ?__SITEURL_multi {}\n filter(bound(?__LOCALPUBKEY_multi))\n {\n select (count(distinct ?lnp) as ?localCount) where {\n values ?__LOCALPUBKEY_multi {}\n values ?__SITEURL_multi {}\n graph npa:graph {\n ?lnp npa:hasValidSignatureForPublicKey ?lsign .\n filter not exists { ?lnpx npx:invalidates ?lnp ; npa:hasValidSignatureForPublicKey ?lsign . }\n ?lnp np:hasAssertion ?la .\n }\n graph ?la { ?lkd npx:declaredBy ?_user_iri ; npx:hasPublicKey ?lpubkey . optional { ?lkd npx:hasKeyLocation ?lloc . } }\n filter(coalesce(str(?lsign) = str(?__LOCALPUBKEY_multi), false))\n filter(coalesce(str(?lpubkey) = str(?__LOCALPUBKEY_multi), false))\n filter(!bound(?lloc) || coalesce(str(?lloc) = str(?__SITEURL_multi), false) || coalesce(replace(str(?lloc), \"nanobench\", \"nanodash\") = str(?__SITEURL_multi), false))\n }\n }\n filter(?localCount = 0)\n filter exists {\n graph npa:graph {\n ?unp npa:hasValidSignatureForPublicKey ?uk .\n filter not exists { ?unpx npx:invalidates ?unp ; npa:hasValidSignatureForPublicKey ?uk . }\n ?unp np:hasAssertion ?ua .\n }\n graph ?ua { ?ukd npx:declaredBy ?_user_iri ; npx:hasPublicKey ?ukey . }\n }\n bind(\"You have introductions elsewhere, but none with this site\'s local key. Use \'derive new introduction\' in the table below to declare those keys alongside the local key.\" as ?recommendation)\n } union {\n # (4) retract: more than one local introduction\n values ?__LOCALPUBKEY_multi {}\n values ?__SITEURL_multi {}\n filter(bound(?__LOCALPUBKEY_multi))\n {\n select (count(distinct ?lnp) as ?localCount) where {\n values ?__LOCALPUBKEY_multi {}\n values ?__SITEURL_multi {}\n graph npa:graph {\n ?lnp npa:hasValidSignatureForPublicKey ?lsign .\n filter not exists { ?lnpx npx:invalidates ?lnp ; npa:hasValidSignatureForPublicKey ?lsign . }\n ?lnp np:hasAssertion ?la .\n }\n graph ?la { ?lkd npx:declaredBy ?_user_iri ; npx:hasPublicKey ?lpubkey . optional { ?lkd npx:hasKeyLocation ?lloc . } }\n filter(coalesce(str(?lsign) = str(?__LOCALPUBKEY_multi), false))\n filter(coalesce(str(?lpubkey) = str(?__LOCALPUBKEY_multi), false))\n filter(!bound(?lloc) || coalesce(str(?lloc) = str(?__SITEURL_multi), false) || coalesce(replace(str(?lloc), \"nanobench\", \"nanodash\") = str(?__SITEURL_multi), false))\n }\n }\n filter(?localCount > 1)\n bind(\"You have multiple introductions from this site. Use \'retract\' in the table below to remove the redundant ones.\" as ?recommendation)\n } union {\n # (5) update-approved: local key not approved, but the user has another approved key\n values ?__LOCALPUBKEY_multi {}\n values ?__SITEURL_multi {}\n filter(bound(?__LOCALPUBKEY_multi))\n {\n select (count(distinct ?lnp) as ?localCount) where {\n values ?__LOCALPUBKEY_multi {}\n values ?__SITEURL_multi {}\n graph npa:graph {\n ?lnp npa:hasValidSignatureForPublicKey ?lsign .\n filter not exists { ?lnpx npx:invalidates ?lnp ; npa:hasValidSignatureForPublicKey ?lsign . }\n ?lnp np:hasAssertion ?la .\n }\n graph ?la { ?lkd npx:declaredBy ?_user_iri ; npx:hasPublicKey ?lpubkey . optional { ?lkd npx:hasKeyLocation ?lloc . } }\n filter(coalesce(str(?lsign) = str(?__LOCALPUBKEY_multi), false))\n filter(coalesce(str(?lpubkey) = str(?__LOCALPUBKEY_multi), false))\n filter(!bound(?lloc) || coalesce(str(?lloc) = str(?__SITEURL_multi), false) || coalesce(replace(str(?lloc), \"nanobench\", \"nanodash\") = str(?__SITEURL_multi), false))\n }\n }\n filter(?localCount > 0)\n bind(lcase(sha256(str(?__LOCALPUBKEY_multi))) as ?lpkHash)\n filter not exists {\n service {\n graph npa:graph { npa:thisRepo npa:hasCurrentTrustState ?tg . }\n graph ?tg { ?acct npa:agent ?_user_iri ; npa:pubkey ?lpkHash ; npa:trustStatus npa:loaded . }\n }\n }\n filter exists {\n service {\n graph npa:graph { npa:thisRepo npa:hasCurrentTrustState ?tg2 . }\n graph ?tg2 { ?acct2 npa:agent ?_user_iri ; npa:pubkey ?okHash ; npa:trustStatus npa:loaded . filter(?okHash != ?lpkHash) }\n }\n }\n bind(\"Your local key is not approved, but you have an approved introduction elsewhere. Add this site\'s local key to that approved introduction, at the site where you created it.\" as ?recommendation)\n }\n}" } } } rows { name { value: "wasAttributedTo" } } rows { name { value: "0000-0002-1267-0234" } } rows { quad { s_iri { prefix_id: 2 name_id: 4 } p_iri { prefix_id: 10 name_id: 21 } o_iri { prefix_id: 9 } g_iri { prefix_id: 2 name_id: 7 } } } rows { name { value: "name" } } rows { quad { s_iri { prefix_id: 9 name_id: 22 } p_iri { prefix_id: 11 } o_literal { lex: "Tobias Kuhn" } g_iri { prefix_id: 2 name_id: 9 } } } rows { name { value: "created" } } rows { datatype { value: "http://www.w3.org/2001/XMLSchema#dateTime" } } rows { quad { s_iri { prefix_id: 1 name_id: 1 } p_iri { prefix_id: 4 name_id: 24 } o_literal { lex: "2026-06-10T11:23:58Z" datatype: 1 } } } rows { name { value: "creator" } } rows { quad { p_iri { } o_iri { prefix_id: 9 name_id: 22 } } } rows { prefix { value: "https://creativecommons.org/licenses/by/4.0/" } } rows { quad { p_iri { prefix_id: 4 name_id: 14 } o_iri { prefix_id: 16 name_id: 2 } } } rows { name { value: "embeds" } } rows { quad { p_iri { prefix_id: 6 name_id: 26 } o_iri { prefix_id: 2 name_id: 12 } } } rows { name { value: "supersedes" } } rows { name { value: "RA32MFuReWbczDt_TjUr_2syPR-Oe_z9PZZLQpPnh528w" } } rows { quad { p_iri { prefix_id: 6 name_id: 27 } o_iri { prefix_id: 1 } } } rows { name { value: "wasCreatedFromProvenanceTemplate" } } rows { name { value: "RA7lSq6MuK_TIC6JMSHvLtee3lpLoZDOqLJCLXevnrPoU" } } rows { quad { p_iri { prefix_id: 5 } o_iri { prefix_id: 1 } } } rows { name { value: "wasCreatedFromPubinfoTemplate" } } rows { name { value: "RA0J4vUn_dekg-U1kK3AOEt02p9mT2WO03uGxLDec1jLw" } } rows { quad { p_iri { prefix_id: 5 } o_iri { prefix_id: 1 } } } rows { name { value: "RAoTD7udB2KtUuOuAe74tJi1t3VzK0DyWS7rYVAq1GRvw" } } rows { quad { o_iri { } } } rows { name { value: "RAukAcWHRDlkqxk7H2XNSegc1WnHI569INvNr-xdptDGI" } } rows { quad { o_iri { } } } rows { name { value: "wasCreatedFromTemplate" } } rows { name { value: "RAEFAt-QcFK0ZhqfvlsmS10BnzGJA0xwOICZXkO-ai87k" } } rows { quad { p_iri { prefix_id: 5 } o_iri { prefix_id: 1 } } } rows { name { value: "sig" } } rows { name { value: "hasAlgorithm" } } rows { quad { s_iri { prefix_id: 2 } p_iri { prefix_id: 6 } o_literal { lex: "RSA" } } } rows { name { value: "hasPublicKey" } } rows { quad { p_iri { } o_literal { lex: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwUtewGCpT5vIfXYE1bmf/Uqu1ojqnWdYxv+ySO80ul8Gu7m8KoyPAwuvaPj0lvPtHrg000qMmkxzKhYknEjq8v7EerxZNYp5B3/3+5ZpuWOYAs78UnQVjbHSmDdmryr4D4VvvNIiUmd0yxci47dTFUj4DvfHnGd6hVe5+goqdcwIDAQAB" } } } rows { name { value: "hasSignature" } } rows { quad { p_iri { } o_literal { lex: "Yiy+3fqb9YhejrAdlHI+0Hya50+MdF1+E5N+T08bFE8MS3g5prRh7+7Uc9yEaEdPYET1x2vRUVIOXF+K0IiVMKfRmbkd1QWaUiKBUPnuriMhlD3JWVMalU37IkLv54qlvZHQQBPNiNNletcEYlECkuwhtfu6kEs8xU0NTA/MEb0=" } } } rows { name { value: "hasSignatureTarget" } } rows { quad { p_iri { } o_iri { prefix_id: 1 name_id: 1 } } } rows { name { value: "signedBy" } } rows { quad { p_iri { prefix_id: 6 name_id: 42 } o_iri { prefix_id: 9 name_id: 22 } } }