{"post_stream":{"posts":[{"id":2579,"name":"Jørn Wildt","username":"JornWildt","avatar_template":"/user_avatar/forum.solidproject.org/jornwildt/{size}/112_2.png","created_at":"2018-12-03T19:53:51.619Z","cooked":"\u003cp\u003eI have just managed to use SPARQL for querying your POD’s personal “type registry” which is a registry that informs web-apps about your preferred data location for various data types (like for instance contacts or photos) - and since Google is incapable of locating any documentation for it, I thought it might useful for others.\u003c/p\u003e\n\u003cp\u003eYou can see the discovery spec. here: \u003ca href=\"https://github.com/solid/solid/blob/master/proposals/data-discovery.md\" rel=\"nofollow noopener\"\u003ehttps://github.com/solid/solid/blob/master/proposals/data-discovery.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe basic technique goes like this:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUse rdflib.js and it’s built-in “fetcher” to fetch data into a data-store as explained here: \u003ca href=\"https://solid.inrupt.com/docs/manipulating-ld-with-rdflib\" rel=\"nofollow noopener\"\u003ehttps://solid.inrupt.com/docs/manipulating-ld-with-rdflib\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFirst fetch the user profile document. Here you find this little reference to the type registry;\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esolid:publicTypeIndex \u0026lt;/settings/publicTypeIndex.ttl\u0026gt; ;\nsolid:privateTypeIndex \u0026lt;/settings/privateTypeIndex.ttl\u0026gt; \n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUse rdflib to find those triples above in the profile document using “match” or “any” and extract the URLs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUse the fetcher again to load the type index resources. My private index tells apps that I want data about my radio controlled hobby stored in \u003ccode\u003e/rc-data\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e@prefix solid: \u0026lt;http://www.w3.org/ns/solid/terms#\u0026gt;.\n@prefix solidrc: \u0026lt;http://solid-rc.net/ns/solidrc#\u0026gt;.\n\u0026lt;\u0026gt;\n    a solid:TypeIndex ;\n    a solid:ListedDocument.\n\n\u0026lt;#reg1\u0026gt;\n    solid:forClass solidrc:data;\n    solid:instanceContainer \u0026lt;/rc-data/\u0026gt;.\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNow the discovery spec says “Find statement pairs of \u003ccode\u003esolid:forClass\u003c/code\u003e and \u003ccode\u003esolid:instanceContainer\u003c/code\u003e to get class reference and data location”. In SPARQL we can express this as:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eSELECT ?cl ?loc\nWHERE \n{\n  ?reg \u0026lt;http://www.w3.org/ns/solid/terms#forClass\u0026gt; ?cl.\n  ?reg \u0026lt;http://www.w3.org/ns/solid/terms#instanceContainer\u0026gt; ?loc.\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis means \"Find all those pairs of \u003ccode\u003ecl\u003c/code\u003e and \u003ccode\u003eloc\u003c/code\u003e that applies to a common resource \u003ccode\u003ereg\u003c/code\u003e - ignore \u003ccode\u003ereg\u003c/code\u003e and return \u003ccode\u003e(cl,loc)\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe have read all the necessary resources (turtle documents) in to the local store and now we only need to run the query:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003econst sparql = `\n  SELECT ?cl ?loc\n  WHERE \n  {\n    ?reg \u0026lt;http://www.w3.org/ns/solid/terms#forClass\u0026gt; ?cl.\n    ?reg \u0026lt;http://www.w3.org/ns/solid/terms#instanceContainer\u0026gt; ?loc.\n  }`\n\nlet query = $rdf.SPARQLToQuery(sparql, false, store);\nreturn new Promise((accept,reject) =\u0026gt;\n  store.query(query, result =\u0026gt;\n  {\n    if (result[\"?cl\"] \u0026amp;\u0026amp; result[\"?loc\"])\n    {\n      console.debug(result[\"?cl\"].value + \" / \" + result[\"?loc\"].value);\n    }\n  },\n  null,\n  () =\u0026gt; accept()));\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe query engine calls the \u003ccode\u003eresult\u003c/code\u003e callback for each pair found.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe “gotcha!” part here is that you need to index the result by \u003ccode\u003e\"?cl\"\u003c/code\u003e and \u003ccode\u003e\"?loc\"\u003c/code\u003e - and you won’t be able to detect that by JSON-dumping \u003ccode\u003eresult\u003c/code\u003e as it comes out as an empty array!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIt seems like the SPARQL library can fetch data too, but I haven’t tried that (yet).\u003c/p\u003e","post_number":1,"post_type":1,"posts_count":2,"updated_at":"2018-12-11T10:21:51.493Z","reply_count":0,"reply_to_post_number":null,"quote_count":0,"incoming_link_count":314,"reads":77,"readers_count":76,"score":1820.4,"yours":false,"topic_id":776,"topic_slug":"fun-fact-using-sparql-to-query-the-type-registry","display_username":"Jørn Wildt","primary_group_name":null,"flair_name":null,"flair_url":null,"flair_bg_color":null,"flair_color":null,"flair_group_id":null,"badges_granted":[],"version":3,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"link_counts":[{"url":"https://github.com/solid/solid/blob/master/proposals/data-discovery.md","internal":false,"reflection":false,"title":"solid/data-discovery.md at master · solid/solid · GitHub","clicks":24},{"url":"https://solid.inrupt.com/docs/manipulating-ld-with-rdflib","internal":false,"reflection":false,"title":"Manipulating linked data with rdflib.js | Solid","clicks":20},{"url":"http://forum.solidproject.org/t/focus-a-solid-task-manager/1022/26","internal":true,"reflection":true,"title":"Focus: A Solid Task Manager","clicks":0}],"read":true,"user_title":null,"bookmarked":false,"actions_summary":[{"id":2,"count":10}],"moderator":false,"admin":false,"staff":false,"user_id":95,"hidden":false,"trust_level":2,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":false,"wiki":false,"post_url":"/t/fun-fact-using-sparql-to-query-the-type-registry/776/1","reactions":[{"id":"heart","type":"emoji","count":10}],"current_user_reaction":null,"reaction_users_count":10,"current_user_used_main_reaction":false,"can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":5917,"name":"Kingsley Uyi Idehen","username":"kidehen","avatar_template":"/user_avatar/forum.solidproject.org/kidehen/{size}/42_2.png","created_at":"2019-04-08T20:25:26.100Z","cooked":"\u003cp\u003eGreat!\u003c/p\u003e\n\u003cp\u003eOn a related note, you can use any SPARQL Query implementation that supports URI-variable and URI-constant dereference in the body of a query to crawl any Solid Pod, subject to ACLs in place.\u003c/p\u003e\n\u003cp\u003eHere is a SPARQL Query example using our \u003ca href=\"https://linkeddata.uriburner.com\" rel=\"nofollow noopener\"\u003eURIBurner Service\u003c/a\u003e (a live Virtuoso Instance)\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"lang-auto\"\u003e## Remove comments to sponge-afresh\n\n# DEFINE input:grab-all \"yes\"\n\nSELECT DISTINCT ?o\nWHERE {\n\t\t { \u0026lt;https://kidehen3.solid.openlinksw.com:8444/public/CoolStuff/\u0026gt;  ldp:contains ?o.\n\t         OPTIONAL { ?o owl:sameAs ?o2 }\n\t\t }\n\t         \n  } \n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eExamples:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://tinyurl.com/y55h9e3s\" rel=\"nofollow noopener\"\u003eLive Query Results Page for one of my Folders\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eRelated\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/solid/node-solid-server/issues/962\" rel=\"nofollow noopener\"\u003eGithub Issues Thread\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/virtuoso-blog/what-is-the-virtuoso-sponger-middleware-about-and-why-is-it-important-293546b32a32\" rel=\"nofollow noopener\"\u003eWhat is the Virtuoso Sponger Middleware about, and why is it important?\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","post_number":3,"post_type":1,"posts_count":2,"updated_at":"2019-04-08T20:26:31.771Z","reply_count":0,"reply_to_post_number":null,"quote_count":0,"incoming_link_count":10,"reads":44,"readers_count":43,"score":103.8,"yours":false,"topic_id":776,"topic_slug":"fun-fact-using-sparql-to-query-the-type-registry","display_username":"Kingsley Uyi Idehen","primary_group_name":null,"flair_name":null,"flair_url":null,"flair_bg_color":null,"flair_color":null,"flair_group_id":null,"badges_granted":[],"version":2,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"link_counts":[{"url":"https://tinyurl.com/y55h9e3s","internal":false,"reflection":false,"clicks":14},{"url":"https://linkeddata.uriburner.com","internal":false,"reflection":false,"title":"Welcome to OpenLink Virtuoso Universal Server","clicks":6},{"url":"https://medium.com/virtuoso-blog/what-is-the-virtuoso-sponger-middleware-about-and-why-is-it-important-293546b32a32","internal":false,"reflection":false,"title":"What is the Virtuoso Sponger Middleware about, and why is it important?","clicks":2},{"url":"https://github.com/solid/node-solid-server/issues/962","internal":false,"reflection":false,"title":"Support SPARQL GET requests as documented on solid-spec · Issue #962 · solid/node-solid-server · GitHub","clicks":0}],"read":true,"user_title":"","bookmarked":false,"actions_summary":[{"id":2,"count":1}],"moderator":false,"admin":false,"staff":false,"user_id":15,"hidden":false,"trust_level":2,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":false,"wiki":false,"post_url":"/t/fun-fact-using-sparql-to-query-the-type-registry/776/3","reactions":[{"id":"heart","type":"emoji","count":1}],"current_user_reaction":null,"reaction_users_count":1,"current_user_used_main_reaction":false,"can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null}],"stream":[2579,5917]},"timeline_lookup":[[1,2884],[2,2758]],"suggested_topics":[],"tags":[],"tags_descriptions":{},"fancy_title":"Fun-fact - using SPARQL to query the type registry","id":776,"title":"Fun-fact - using SPARQL to query the type registry","posts_count":2,"created_at":"2018-12-03T19:53:51.547Z","views":1748,"reply_count":0,"like_count":11,"last_posted_at":"2019-04-08T20:25:26.100Z","visible":true,"closed":false,"archived":false,"has_summary":false,"archetype":"regular","slug":"fun-fact-using-sparql-to-query-the-type-registry","category_id":6,"word_count":588,"deleted_at":null,"user_id":95,"featured_link":null,"pinned_globally":false,"pinned_at":null,"pinned_until":null,"image_url":null,"slow_mode_seconds":0,"draft":null,"draft_key":"topic_776","draft_sequence":null,"unpinned":null,"pinned":false,"current_post_number":1,"highest_post_number":3,"deleted_by":null,"actions_summary":[{"id":4,"count":0,"hidden":false,"can_act":false},{"id":8,"count":0,"hidden":false,"can_act":false},{"id":10,"count":0,"hidden":false,"can_act":false},{"id":7,"count":0,"hidden":false,"can_act":false}],"chunk_size":20,"bookmarked":false,"topic_timer":null,"message_bus_last_id":0,"participant_count":2,"show_read_indicator":false,"thumbnails":null,"slow_mode_enabled_until":null,"tags_disable_ads":false,"related_topics":[{"fancy_title":"Using SPARQL on Solid Data","id":1335,"title":"Using SPARQL on Solid Data","slug":"using-sparql-on-solid-data","posts_count":4,"reply_count":1,"highest_post_number":4,"image_url":null,"created_at":"2019-02-22T20:02:11.562Z","last_posted_at":"2019-03-28T14:15:56.495Z","bumped":true,"bumped_at":"2019-03-28T14:15:56.495Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"like_count":2,"views":3206,"category_id":6,"featured_link":null,"op_like_count":0,"has_accepted_answer":false,"posters":[{"extras":null,"description":"Original Poster","user":{"id":583,"username":"JacobMcConomy","name":"Jacob Mc Conomy","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/j/ee59a6/{size}.png","trust_level":1}},{"extras":null,"description":"Recent Poster","user":{"id":133,"username":"jeffz","name":"Jeff Zucker","avatar_template":"/user_avatar/forum.solidproject.org/jeffz/{size}/600_2.png","moderator":true,"trust_level":4}},{"extras":"latest","description":"Most Recent Poster","user":{"id":675,"username":"cldwalker","name":"Gabriel Horner","avatar_template":"/user_avatar/forum.solidproject.org/cldwalker/{size}/869_2.png","trust_level":1}}]},{"fancy_title":"Query over user\u0026rsquo;s POD","id":2840,"title":"Query over user's POD","slug":"query-over-users-pod","posts_count":25,"reply_count":12,"highest_post_number":25,"image_url":null,"created_at":"2020-04-02T12:03:42.531Z","last_posted_at":"2021-02-22T22:54:58.461Z","bumped":true,"bumped_at":"2021-02-22T22:54:58.461Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"like_count":8,"views":2054,"category_id":24,"featured_link":null,"op_like_count":0,"has_accepted_answer":false,"posters":[{"extras":null,"description":"Original Poster","user":{"id":1107,"username":"christian98","name":"","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/c/7ba0ec/{size}.png","trust_level":1}},{"extras":null,"description":"Frequent Poster","user":{"id":121,"username":"Smag0","name":"Spoggy","avatar_template":"/user_avatar/forum.solidproject.org/smag0/{size}/310_2.png","trust_level":2}},{"extras":null,"description":"Frequent Poster","user":{"id":672,"username":"Vincent","name":"Vincent (he)","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/v/e9bcb4/{size}.png","trust_level":2}},{"extras":null,"description":"Recent Poster","user":{"id":1431,"username":"ch1ch0gz","name":"Ch1ch0gz","avatar_template":"/user_avatar/forum.solidproject.org/ch1ch0gz/{size}/2227_2.png","trust_level":2}},{"extras":"latest","description":"Most Recent Poster","user":{"id":133,"username":"jeffz","name":"Jeff Zucker","avatar_template":"/user_avatar/forum.solidproject.org/jeffz/{size}/600_2.png","moderator":true,"trust_level":4}}]},{"fancy_title":"Keyword search on a POD rdf resource","id":6293,"title":"Keyword search on a POD rdf resource","slug":"keyword-search-on-a-pod-rdf-resource","posts_count":9,"reply_count":7,"highest_post_number":9,"image_url":null,"created_at":"2023-03-10T17:01:54.929Z","last_posted_at":"2023-03-10T19:20:21.642Z","bumped":true,"bumped_at":"2023-03-10T19:20:21.642Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"like_count":0,"views":464,"category_id":6,"featured_link":null,"op_like_count":0,"has_accepted_answer":false,"posters":[{"extras":"latest","description":"Original Poster, Most Recent Poster","user":{"id":2491,"username":"RezMosa","name":"Reza Moosaei","avatar_template":"/user_avatar/forum.solidproject.org/rezmosa/{size}/3773_2.png","trust_level":0}},{"extras":null,"description":"Recent Poster","user":{"id":133,"username":"jeffz","name":"Jeff Zucker","avatar_template":"/user_avatar/forum.solidproject.org/jeffz/{size}/600_2.png","moderator":true,"trust_level":4}}]},{"fancy_title":"SOLID Server SPARQL Endpoint","id":2920,"title":"SOLID Server SPARQL Endpoint","slug":"solid-server-sparql-endpoint","posts_count":7,"reply_count":7,"highest_post_number":12,"image_url":null,"created_at":"2020-04-18T20:30:39.391Z","last_posted_at":"2020-04-20T15:56:03.120Z","bumped":true,"bumped_at":"2020-04-20T15:56:03.120Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"like_count":17,"views":2365,"category_id":34,"featured_link":null,"op_like_count":4,"has_accepted_answer":false,"posters":[{"extras":"latest","description":"Original Poster, Most Recent Poster","user":{"id":1134,"username":"walter.almeida","name":"Walter Almeida","avatar_template":"/user_avatar/forum.solidproject.org/walter.almeida/{size}/1974_2.png","trust_level":2}},{"extras":null,"description":"Recent Poster","user":{"id":31,"username":"happybeing","name":"Mark (theWebalyst)","avatar_template":"/user_avatar/forum.solidproject.org/happybeing/{size}/59_2.png","trust_level":2}},{"extras":null,"description":"Recent Poster","user":{"id":986,"username":"alexcorvis84","name":"Alejandro Juan Garcia","avatar_template":"/user_avatar/forum.solidproject.org/alexcorvis84/{size}/1276_2.png","trust_level":2}}]},{"fancy_title":"How to query SOLID server using GET requests and the SPARQL protocol?","id":2805,"title":"How to query SOLID server using GET requests and the SPARQL protocol?","slug":"how-to-query-solid-server-using-get-requests-and-the-sparql-protocol","posts_count":5,"reply_count":2,"highest_post_number":5,"image_url":null,"created_at":"2020-03-27T13:40:47.059Z","last_posted_at":"2020-03-28T18:27:42.272Z","bumped":true,"bumped_at":"2020-03-28T18:27:42.272Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"like_count":4,"views":2112,"category_id":14,"featured_link":null,"op_like_count":0,"has_accepted_answer":false,"posters":[{"extras":"latest","description":"Original Poster, Most Recent Poster","user":{"id":1107,"username":"christian98","name":"","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/c/7ba0ec/{size}.png","trust_level":1}},{"extras":null,"description":"Recent Poster","user":{"id":133,"username":"jeffz","name":"Jeff Zucker","avatar_template":"/user_avatar/forum.solidproject.org/jeffz/{size}/600_2.png","moderator":true,"trust_level":4}},{"extras":null,"description":"Recent Poster","user":{"id":121,"username":"Smag0","name":"Spoggy","avatar_template":"/user_avatar/forum.solidproject.org/smag0/{size}/310_2.png","trust_level":2}}]}],"summarizable":false,"has_cached_summary":false,"valid_reactions":["heart","+1","laughing","open_mouth","clap","confetti_ball","hugs"],"has_accepted_answer":false,"can_create_shared_issue":false,"shared_issue_visible":false,"discourse_zendesk_plugin_zendesk_id":null,"discourse_zendesk_plugin_zendesk_url":"https://your-url.zendesk.com/agent/tickets/","details":{"can_edit":false,"notification_level":1,"participants":[{"id":15,"username":"kidehen","name":"Kingsley Uyi Idehen","avatar_template":"/user_avatar/forum.solidproject.org/kidehen/{size}/42_2.png","post_count":1,"primary_group_name":null,"flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":2},{"id":95,"username":"JornWildt","name":"Jørn Wildt","avatar_template":"/user_avatar/forum.solidproject.org/jornwildt/{size}/112_2.png","post_count":1,"primary_group_name":null,"flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":2}],"created_by":{"id":95,"username":"JornWildt","name":"Jørn Wildt","avatar_template":"/user_avatar/forum.solidproject.org/jornwildt/{size}/112_2.png"},"last_poster":{"id":15,"username":"kidehen","name":"Kingsley Uyi Idehen","avatar_template":"/user_avatar/forum.solidproject.org/kidehen/{size}/42_2.png"},"links":[{"url":"https://github.com/solid/solid/blob/master/proposals/data-discovery.md","title":"solid/data-discovery.md at master · solid/solid · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":24,"user_id":95,"domain":"github.com","root_domain":"github.com"},{"url":"https://solid.inrupt.com/docs/manipulating-ld-with-rdflib","title":"Manipulating linked data with rdflib.js | Solid","internal":false,"attachment":false,"reflection":false,"clicks":20,"user_id":95,"domain":"solid.inrupt.com","root_domain":"inrupt.com"},{"url":"https://tinyurl.com/y55h9e3s","title":null,"internal":false,"attachment":false,"reflection":false,"clicks":14,"user_id":15,"domain":"tinyurl.com","root_domain":"tinyurl.com"},{"url":"https://linkeddata.uriburner.com","title":"Welcome to OpenLink Virtuoso Universal Server","internal":false,"attachment":false,"reflection":false,"clicks":6,"user_id":15,"domain":"linkeddata.uriburner.com","root_domain":"uriburner.com"},{"url":"https://medium.com/virtuoso-blog/what-is-the-virtuoso-sponger-middleware-about-and-why-is-it-important-293546b32a32","title":"What is the Virtuoso Sponger Middleware about, and why is it important?","internal":false,"attachment":false,"reflection":false,"clicks":2,"user_id":15,"domain":"medium.com","root_domain":"medium.com"}]},"bookmarks":[]}