{"id":700,"date":"2004-10-07T08:55:04","date_gmt":"2004-10-07T08:55:04","guid":{"rendered":"http:\/\/beta.robertprice.co.uk\/robblog\/2004\/10\/parsing_rdf_in_perl_with_rdf_core-shtml\/"},"modified":"2004-10-07T08:55:04","modified_gmt":"2004-10-07T08:55:04","slug":"parsing_rdf_in_perl_with_rdf_core-shtml","status":"publish","type":"post","link":"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/","title":{"rendered":"Parsing RDF In Perl With RDF::Core"},"content":{"rendered":"<p>\nIt is often said that parsing <acronym title=\"Resource Definition Framework\">RDF<\/acronym> files is hard. It&#8217;s not. What most people really find hard is turning the RDF\/XML into a series of triples and extracting data from them.\n<\/p>\n<p>\nWhen stored in RDF\/XML, triples can be written in a variety of various ways, but still mean the same thing. This means using an XML parser may not always give you the same results. To solve this we use an RDF parser to get the triples for us. An RDF parser is usually built on top of an existing XML parser but with enough logic to know how to turn the data contained in an XML file into a list of triples correctly.\n<\/p>\n<p>\nThere are various RDF parsers for <a href=\"http:\/\/www.perl.com\/\">Perl<\/a>. These include <a href=\"http:\/\/search.cpan.org\/~dpokorny\/RDF-Core-0.31\/lib\/RDF\/Core.pm\">RDF::Core<\/a>, <a href=\"http:\/\/search.cpan.org\/~zooleika\/RDF-Simple-0.15\/lib\/RDF\/Simple.pm\">RDF::Simple<\/a>, <a href=\"http:\/\/search.cpan.org\/~djbeckett\/Redland-0.9.14.1\/perl\/lib\/RDF\/Redland.pm\">RDF::Redland<\/a> and several others.\n<\/p>\n<p>\nParsing is all well and good, each one of the above can give us a list of triples. What we really need is a way to query the data to extract the data we need.\n<\/p>\n<p>\nIn this article I&#8217;m going to use RDF::Core.\n<\/p>\n<p>\nRDF::Core is a bit of a beast and doesn&#8217;t have a very Perl&#8217;ish interface.\n<\/p>\n<p>\nI&#8217;m going to parse <a href=\"\/foaf.rdf\">my FOAF file<\/a> and extract a list of my friends FOAF files.\n<\/p>\n<p>\nFOAF means Friend of a Friend and it allows you to describe relationships between people in a machine readable RDF format. Details of it can be found on the <a href=\"http:\/\/www.foaf-project.org\/\">FOAF project website<\/a>.\n<\/p>\n<p>\nSo how do we do this using RDF::Core?\n<\/p>\n<p>\nFirstly we need to set it up. We&#8217;ll need to a model and define the storage method we want. RDF::Core allows data to be stored in a database, DB_File or memory. In this example I&#8217;ll just use memory as it&#8217;s the simplest.\n<\/p>\n<div class=\"code\"><code>my $store = RDF::Core::Storage::Memory-&gt;new;<br \/>\nmy $model = RDF::Core::Model->new(Storage =&gt; $store;<br \/>\n<\/code><\/div>\n<p>\nNow we need create a parser, and parse the the RDF file. To do this we pass in our Model, BaseURI, Source, SourceType of the RDF data. In this example I&#8217;m going to use the file <var>foaf.rdf<\/var> so I&#8217;ll have to set the <var>SourceType<\/var> parameter to <var>file<\/var>. The <var>BaseURI<\/var> is used to resolve relative URI&#8217;s, so we&#8217;ll use the FOAF namespace URI <var>http:\/\/xmlns.com\/foaf\/0.1\/<\/var> for this. Once we have our parser built, we just call it&#8217;s <code>parse<\/code> method.\n<\/p>\n<div class=\"code\"><code>my $parser = RDF::Core::Model::Parser-&gt;new(<br \/>\nModel =&gt; $model,<br \/>\nBaseURI =&gt; 'http:\/\/xmlns.com\/foaf\/0.1\/',<br \/>\nSource =&gt; '.\/foaf.rdf',<br \/>\nSourceType =&gt; 'file'<br \/>\n);<br \/>\n$parser-&gt;parse;<br \/>\n<\/code><\/div>\n<p>\nWe now have a list of triples in our memory store. That&#8217;s great, but we want to find out if any of my friends have FOAF files.\n<\/p>\n<p>\nIf you look at the example in <a href=\"\/robblog\/archive\/2004\/10\/What_Is_An_RDF_Triple_.shtml\" title=\"What is an RDF triple?\">my previous article on RDF triples<\/a>, you&#8217;ll know that my friends details are referenced by the <var>#knows<\/var> predicate. So we need to find out all the triples that have that as a predicate and get their objects. Once we have these, we can look for all triples that have this as their subject and also have the predicate of <var>#seeAlso<\/var>. The object of all these triples will be the address of my friend&#8217;s FOAF files.\n<\/p>\n<p>\nRefer to my article <a href=\"\/robblog\/archive\/2004\/10\/What_Is_An_RDF_Triple_.shtml\">What Is An RDF Triple<\/a> for a detailed explanation and commented example of the above.\n<\/p>\n<p>\nRDF::Core needs all resources to be created as RDF::Core::Resource objects. We&#8217;ll need to create resources for <var>#seeAlso<\/var> and <var>#knows<\/var> if we are to query with them, so lets do that now.\n<\/p>\n<div class=\"code\"><code>my $seealso = RDF::Core::Resource-&gt;new('http:\/\/www.w3.org\/2000\/01\/rdf-schema#seeAlso');<br \/>\nmy $knows = RDF::Core::Resource-&gt;new('http:\/\/xmlns.com\/foaf\/0.1\/knows');<br \/>\n<\/code><\/div>\n<p>\nWe can use the getStmts method in the model to get triples matching a given subject, predicate or object. We can either pass in RDF::Core::Resource&#8217;s with the values we want to check against, or <code>undef<\/code> if we want to match everything. This returns an enumerator that we can use to get each matching triple in turn.\n<\/p>\n<p>\nTo start with we need to get a list of any triples that match our <var>#knows<\/var> predicate. This is done like this.\n<\/p>\n<div class=\"code\"><code>my $knows_enum = $model-&gt;getStmts(undef, $knows,  undef);<br \/>\n<\/code><\/div>\n<p>\nNext we need to enumerate over any triples we have.\n<\/p>\n<div class=\"code\"><code>my $statement = $knows_enum-&gt;getFirst;<br \/>\nwhile (defined $statement) {<br \/>\nmy $knows_object = $statement->getObject;<br \/>\n## code to handle each statement goes here<br \/>\n$statement = $knows_enum-&gt;getNext;<br \/>\n}<br \/>\n<\/code><\/div>\n<p>\nNow we know have a list of triples whose object represents the subject of the triples we want to query, We need to match those with this value as the subject and with the predicate of <var>#seeAlso<\/var>.\n<\/p>\n<p>\nWe get get the triples using code very similar to code just used. If we insert the following code into the <code>while<\/code> loop, we can extract this information.\n<\/p>\n<div class=\"code\"><code>my $seealso_enum = $model-&gt;getStmts($knows_object, $seealso, undef);<br \/>\nmy $seealso_object = $seealso_enum-&gt;getFirst;<br \/>\nif (defined $seealso_object) {<br \/>\nprint $seealso_object-&gt;getObject-&gt;getLabel, \"n\";<br \/>\n}<br \/>\n<\/code><\/div>\n<p>\nAs we only wanted the first <var>#seeAlso<\/var> value per <var>#knows<\/var> triple, we don&#8217;t have to worry about going through every object in the enumerator, only the first.\n<\/p>\n<p>\nPutting it all together, we have a simple script to parse a FOAF file, and print out address of our friend&#8217;s FOAF files.\n<\/p>\n<div class=\"code\"><code>#!\/usr\/bin\/perl -w<br \/>\n## Extract a list of seeAlso triples from a FOAF file<br \/>\n## Robert Price - http:\/\/www.robertprice.co.uk\/<br \/>\nuse strict;<br \/>\nuse RDF::Core::Model;<br \/>\nuse RDF::Core::Storage::Memory;<br \/>\nuse RDF::Core::Model::Parser;<br \/>\nuse RDF::Core::Resource;<br \/>\n## create our model and storage for triples.<br \/>\nmy $store = RDF::Core::Storage::Memory-&gt;new;<br \/>\nmy $model = RDF::Core::Model-&gt;new(Storage =&gt; $store);<br \/>\n## create our parse and parse the Source file.<br \/>\nmy $parser = RDF::Core::Model::Parser-&gt;new(<br \/>\nModel =&gt; $model,<br \/>\nBaseURI =&gt; 'http:\/\/xmlns.com\/foaf\/0.1\/',<br \/>\nSource =&gt; '.\/foaf.rdf',<br \/>\nSourceType =&gt; 'file'<br \/>\n);<br \/>\n$parser-&gt;parse;<br \/>\n## create a resource for seeAlso and knows triples.<br \/>\nmy $seealso = RDF::Core::Resource-&gt;new('http:\/\/www.w3.org\/2000\/01\/rdf-schema#seeAlso');<br \/>\nmy $knows = RDF::Core::Resource-&gt;new('http:\/\/xmlns.com\/foaf\/0.1\/knows');<br \/>\n## create an enumerator with all the knows triples.<br \/>\nmy $knows_enum = $model-&gt;getStmts(undef, $knows, undef);<br \/>\n## enumerate over each knows triple.<br \/>\nmy $statement = $knows_enum-&gt;getFirst;<br \/>\nwhile (defined $statement) {<br \/>\n## get the object of the current triple.<br \/>\nmy $knows_object = $statement-&gt;getObject;<br \/>\n## look for subject of the enumerator (knows), and predicate of<br \/>\n## seealso<br \/>\nmy $seealso_enum = $model-&gt;getStmts($knows_object, $seealso, undef);<br \/>\nmy $seealso_obj = $seealso_enum-&gt;getFirst;<br \/>\n## if it has a seealso triple, show the value of it.<br \/>\nif (defined $seealso_obj) {<br \/>\nprint $seealso_obj-&gt;getObject-&gt;getLabel, \"n\";<br \/>\n}<br \/>\n## get the next knows statement.<br \/>\n$statement = $knows_enum-&gt;getNext;<br \/>\n}<br \/>\n<\/code><\/div>\n<p>\nI hope this has started to demystify RDF parsing with Perl.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>It is often said that parsing RDF files is hard. It&#8217;s not. What most people really find hard is turning the RDF\/XML into a series of triples and extracting data from them. When stored in RDF\/XML, triples can be written in a variety of various ways, but still mean the same thing. This means using &hellip; <a href=\"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Parsing RDF In Perl With RDF::Core&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[2],"tags":[47,56],"class_list":["post-700","post","type-post","status-publish","format-standard","hentry","category-dev","tag-perl","tag-rdf"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Parsing RDF In Perl With RDF::Core - Robert Price<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Parsing RDF In Perl With RDF::Core - Robert Price\" \/>\n<meta property=\"og:description\" content=\"It is often said that parsing RDF files is hard. It&#8217;s not. What most people really find hard is turning the RDF\/XML into a series of triples and extracting data from them. When stored in RDF\/XML, triples can be written in a variety of various ways, but still mean the same thing. This means using &hellip; Continue reading &quot;Parsing RDF In Perl With RDF::Core&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/\" \/>\n<meta property=\"og:site_name\" content=\"Robert Price\" \/>\n<meta property=\"article:published_time\" content=\"2004-10-07T08:55:04+00:00\" \/>\n<meta name=\"author\" content=\"rob\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"rob\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/parsing_rdf_in_perl_with_rdf_core-shtml\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/parsing_rdf_in_perl_with_rdf_core-shtml\\\/\"},\"author\":{\"name\":\"rob\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#\\\/schema\\\/person\\\/fac6d5b076e0e14e1fb13e15b542a6c5\"},\"headline\":\"Parsing RDF In Perl With RDF::Core\",\"datePublished\":\"2004-10-07T08:55:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/parsing_rdf_in_perl_with_rdf_core-shtml\\\/\"},\"wordCount\":778,\"keywords\":[\"Perl\",\"RDF\"],\"articleSection\":[\"Dev\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/parsing_rdf_in_perl_with_rdf_core-shtml\\\/\",\"url\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/parsing_rdf_in_perl_with_rdf_core-shtml\\\/\",\"name\":\"Parsing RDF In Perl With RDF::Core - Robert Price\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#website\"},\"datePublished\":\"2004-10-07T08:55:04+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#\\\/schema\\\/person\\\/fac6d5b076e0e14e1fb13e15b542a6c5\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/parsing_rdf_in_perl_with_rdf_core-shtml\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/parsing_rdf_in_perl_with_rdf_core-shtml\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/parsing_rdf_in_perl_with_rdf_core-shtml\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Parsing RDF In Perl With RDF::Core\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#website\",\"url\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/\",\"name\":\"Robert Price\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#\\\/schema\\\/person\\\/fac6d5b076e0e14e1fb13e15b542a6c5\",\"name\":\"rob\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g\",\"caption\":\"rob\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Parsing RDF In Perl With RDF::Core - Robert Price","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/","og_locale":"en_GB","og_type":"article","og_title":"Parsing RDF In Perl With RDF::Core - Robert Price","og_description":"It is often said that parsing RDF files is hard. It&#8217;s not. What most people really find hard is turning the RDF\/XML into a series of triples and extracting data from them. When stored in RDF\/XML, triples can be written in a variety of various ways, but still mean the same thing. This means using &hellip; Continue reading \"Parsing RDF In Perl With RDF::Core\"","og_url":"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/","og_site_name":"Robert Price","article_published_time":"2004-10-07T08:55:04+00:00","author":"rob","twitter_card":"summary_large_image","twitter_misc":{"Written by":"rob","Estimated reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/#article","isPartOf":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/"},"author":{"name":"rob","@id":"https:\/\/www.robertprice.co.uk\/robblog\/#\/schema\/person\/fac6d5b076e0e14e1fb13e15b542a6c5"},"headline":"Parsing RDF In Perl With RDF::Core","datePublished":"2004-10-07T08:55:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/"},"wordCount":778,"keywords":["Perl","RDF"],"articleSection":["Dev"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/","url":"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/","name":"Parsing RDF In Perl With RDF::Core - Robert Price","isPartOf":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/#website"},"datePublished":"2004-10-07T08:55:04+00:00","author":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/#\/schema\/person\/fac6d5b076e0e14e1fb13e15b542a6c5"},"breadcrumb":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.robertprice.co.uk\/robblog\/parsing_rdf_in_perl_with_rdf_core-shtml\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.robertprice.co.uk\/robblog\/"},{"@type":"ListItem","position":2,"name":"Parsing RDF In Perl With RDF::Core"}]},{"@type":"WebSite","@id":"https:\/\/www.robertprice.co.uk\/robblog\/#website","url":"https:\/\/www.robertprice.co.uk\/robblog\/","name":"Robert Price","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.robertprice.co.uk\/robblog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/www.robertprice.co.uk\/robblog\/#\/schema\/person\/fac6d5b076e0e14e1fb13e15b542a6c5","name":"rob","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g","caption":"rob"}}]}},"_links":{"self":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts\/700","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/comments?post=700"}],"version-history":[{"count":0,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts\/700\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/media?parent=700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/categories?post=700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/tags?post=700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}