{"id":1817,"date":"2008-01-25T09:18:00","date_gmt":"2008-01-25T09:18:00","guid":{"rendered":"http:\/\/www.leobard.net\/blog\/?p=1817"},"modified":"2017-11-04T15:47:36","modified_gmt":"2017-11-04T15:47:36","slug":"combining-rules-with-sparql","status":"publish","type":"post","link":"https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/","title":{"rendered":"Combining Rules with SPARQL"},"content":{"rendered":"<p>a recent <a href=\"http:\/\/danbri.org\/words\/2008\/01\/22\/260\">blog-post by Dan Brickley<\/a> reminded me that we have a Jena-Rule engine augmented with SPARQL dusting our shelves. Its years old, but may be interesting for you.<\/p>\n<p>We augmented Jena&#8217;s rules by adding sparql. <br \/>\nThe passing of parameters is easy, you just have to use the variables of the rules. Within Jena rules, you can always express graphs using N-Triple Axioms, so its also possible to write RDF files.<br \/>\nOnly caveat: no quads.<\/p>\n<p>code is in this folder<br \/>\n<a href=\"http:\/\/gnowsis.opendfki.de\/browser\/tags\/0.8.3-alpha\/gnowsis_retrieval\/WEB-INF\/src\/org\/gnowsis\/retrieval\/RuleQuerySparql.java\">http:\/\/gnowsis.opendfki.de\/browser\/tags\/0.8.3-alpha\/gnowsis_retrieval\/WEB-INF\/src\/org\/gnowsis\/retrieval\/RuleQuerySparql.java<\/a><\/p>\n<p>download SVN URI:<br \/>\n<a href=\"http:\/\/gnowsis.opendfki.de\/repos\/gnowsis\/tags\/0.8.3-alpha\/gnowsis_retrieval\/WEB-INF\/src\/org\/gnowsis\/retrieval\/RuleQuerySparql.java\">http:\/\/gnowsis.opendfki.de\/repos\/gnowsis\/tags\/0.8.3-alpha\/gnowsis_retrieval\/WEB-INF\/src\/org\/gnowsis\/retrieval\/RuleQuerySparql.java<\/a><\/p>\n<p>documentation:<br \/>\n<a href=\"http:\/\/gnowsis.opendfki.de\/browser\/tags\/0.8.3-alpha\/gnowsis_retrieval\/doc\/help.html\">http:\/\/gnowsis.opendfki.de\/browser\/tags\/0.8.3-alpha\/gnowsis_retrieval\/doc\/help.html<\/a><\/p>\n<p>Here is a snippet of that documentation for you:<\/p>\n<h2>Inference<\/h2>\n<p>After the results have been gathered, inference rules are evaluated against the results.<br \/>\nThis means, that you can define rules on which new information is generated <br \/>\nbased on a declarative syntax described in the <br \/>\n<a href=\"http:\/\/jena.sourceforge.net\/inference\/index.html#RULEhybrid\">Jena Rule Engine DOC<\/a>.<br \/>\nAn example file for these rules can be found in the source, at best directly in SVN here:<br \/>\n<a href=\"http:\/\/gnowsis.opendfki.de\/repos\/gnowsis\/trunk\/gnowsis_retrieval\/WEB-INF\/src\/org\/gnowsis\/retrieval\/retrieval.rules.txt\">retrieval.rules.txt<\/a>.<br \/>\nYou can use the existing Jena rules and a special rule that was created by Leo Sauermann to <br \/>\nload additional triples from the gnowsis. This query-rule is defined as follows:\n<\/p>\n<pre>\n# Load triples from the search storage by a triple patter.\n# The search storage is crawled by gnowsis IF you enabled it in the\n# configuration and have crawled a few datasources. If not, this query\n# will return nothing.\n\nqueryStorage(?subject, ?predicate, ?object, 'search')\n\n# ?subject, ?predicate, ?object: a triple pattern. \n# Leave one of the empty (= a unbound variable like ?_x) and it will try to match \n# the empty thing as a wildcard. The variables are not bound in the pattern and\n# cannot be used in the same rule. You have to write additional rules to work\n# on the queried triples. \n\nusage example:\n# load all project members and managers\n(?project rdf:type org:Project) -&gt;\nqueryStorage(?project, org:containsMember, ?_y, 'search'),\nqueryStorage(?project, org:managedBy, ?_z, 'search').\n<\/pre>\n<p>If you want to bind the variables and use them: It is not possible. See the<br \/>\n<a href=\"http:\/\/groups.yahoo.com\/group\/jena-dev\/message\/18593\">statement of the Jena developers<\/a> <br \/>\nabout this. But this is not a big problem, you can work around it easily.<\/p>\n<h2>Debugging Inference<\/h2>\n<p>If you want to tweak your inference rules and don&#8217;t want to have gnowsis run the query at all times,<br \/>\nyou can use our built-in inference debugging tricks.\n<\/p>\n<ul>\n<li>first: when you run the query for debugging, click the <b>&#8216;rerun only rules&#8217;<\/b> link at the bottom of your search<\/li>\n<li>second: open the inference file by clicking <a href=\"http:\/\/localhost:9998\/gnowsis_retrieval\/retrieval?cmd=editrulesfile\">&#8216;edit rules file&#8217;<\/a> <br \/>\n(also found at the bottom of each search result)<\/li>\n<\/ul>\n<p>the first stage brings you into a query mode, where pressing <b>&#8220;reload&#8221;<\/b> in the browser<br \/>\njust does the inference and the clustering, but not the search itself. This speeds up<br \/>\nyour debugging of inference rules. You will only spot the difference in the addressbar<br \/>\nof the browser, which now contains something like <i>http:\/\/&#8230;\/retrieval?cmd=runrules&amp;query=YourQuery<\/i><\/p>\n<p>Also, note that <b>syntax errors<\/b> in your inference code will be logged to the gnowsis<br \/>\nlogging system. This is either the message window, pane &#8216;org.gnowsis.retrieval.RetrievalService&#8217; <br \/>\nor your file logging in ~\/.gnowsis\/data\/&#8230; .<br \/>\nYou will not see syntax errors in your query results, sorry.\n<\/p>\n<p><\/p>\n<h3>Inference and SPARQL combined<\/h3>\n<p><a href=\"http:\/\/www.w3.org\/TR\/rdf-sparql-query\/\">SPARQL reference<\/a><\/p>\n<p>You can also use SPARQL queries to refine and expand the search results.<br \/>\nThe basic syntax is to run a SPARQL query in the head of a rule, the first argument <br \/>\nis the query, escaped with &#8221;, the following arguments are variables that will<br \/>\nbe used in the query. The passed variables are interpreted as named variables<br \/>\nin the SPARQL query, named ?x1 ?x2 ?x3, etc.\n<\/p>\n<pre>\nExample for querySparql:\n\n(?a ?b ?c) -&gt;\nquerySparql('\n PREFIX rdfs:    &lt;http:\/\/www.w3.org\/2000\/01\/rdf-schema#&gt;\n CONSTRUCT   { ?x1 rdfs:label ?label }\n WHERE       { ?x1 rdfs:label ?label }\n')\n', ?c).\n\nThe variable named ?x1 will be replaced with the value of ?c.\n\n<\/pre>\n<p>Note the <br \/>\nfollowing tips: <\/p>\n<ul>\n<li>literals are escaped using the <b>\\&#8217;text\\&#8217;<\/b> markup.<\/li>\n<li>All arguments passed after the query will be bound into the query using names ?x1, ?x2, &#8230;<\/li>\n<li>querySparql can only be used in the head of rules.<\/li>\n<li><b>Attention: if you are querying the gnowsis biggraph, you have to add the graph-name to your  <br \/>\nsparql queries. <\/b><\/li>\n<li>Try out your queries <a href=\"http:\/\/localhost:9998\/gnowsis\/\">on the debug interface<\/a> before you use them.<\/li>\n<li>Only &#8216;construct&#8217; queries are supported, not select or describe.<\/li>\n<li>Namespace prefixes: inside the SPARQL query, you can use the namespace prefixes defined in the rule file<\/li>\n<\/ul>\n<p>An example to do so is given now, the task here is to retrieve the members of a project if a project <br \/>\nwas in the result.<\/p>\n<pre>\n#note that these namespace prefixes are available in the sparql query\n@prefix skos: &lt;http:\/\/www.w3.org\/2004\/02\/skos\/core#&gt;.\n@prefix rdfs: &lt;http:\/\/www.w3.org\/2000\/01\/rdf-schema#&gt;.\n@prefix rdf:  &lt;http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#&gt;.\n@prefix owl:  &lt;http:\/\/www.w3.org\/2002\/07\/owl#&gt;.\n@prefix retrieve: &lt;http:\/\/www.gnowsis.org\/ont\/gnoretrieve#&gt;.\n@prefix tag: &lt;http:\/\/www.gnowsis.org\/ont\/gnoretrievetag#&gt;.\n\n# get members with SPARQL\n# note the special namspace defined inside\n(?hit retrieve:item ?project),\n(?project rdf:type org:Project) -&gt;\nquerySparql('\nPREFIX org: &lt;http:\/\/km.dfki.de\/model\/org#&gt;\nCONSTRUCT   { \n  ?x1 org:containsMember ?m. ?m rdfs:label ?labelm. ?m rdf:type ?typem.\n  ?x1 tag:todoRelateHitTo _:hit .\n  _:hit rdf:type retrieve:InferedHit .\n  _:hit retrieve:item ?m .\n  _:hit retrieve:textSnippet \\'member of project\\'.\n}\nWHERE       { graph ?g {\n  ?x1 org:containsMember ?m. ?m rdfs:label ?labelm. ?m rdf:type ?typem.\n} }\n', ?project).\n\n# make the missing relations to the hits\n# this is needed because you cannot pass blank nodes into the SPARQL engine.\n(?item tag:todoRelateHitTo ?tohit),\n(?hit retrieve:item ?item) -&gt;\n(?hit retrieve:related ?tohit).\n<\/pre>\n<pre>\nrun a sparql query, replacing placeholders (?x1, ?x2, ...) in the query with the passed arguments,\narguments have to be bound. Only 'construct' queries are supported.\n \n# retrieve a test sparql\n[test:\n(http:\/\/xmlns.com\/foaf\/0.1\/ ?x ?type)\n-&gt; querySparql('\nCONSTRUCT   { ?x1 rdfs:label ?label }\nWHERE       { ?x1 rdfs:label ?label. FILTER (?x1 = foaf:name) }\n')\n]\n\n# retrieve with param - bind ?ont to the foaf ontology, it is called x1 in the query\n[testbind:\n(?ont rdf:type owl:Ontology)\n-&gt; querySparql('\nCONSTRUCT   { ?p rdfs:isDefinedBy ?x1. ?p rdfs:label ?label. }\nWHERE       { ?p rdfs:isDefinedBy ?x1. ?p rdfs:label ?label. }\n', ?ont)\n]\n\n\n# example for gnowsis. note the use of \"....{ graph ?g { ....\"\n[test:\n(http:\/\/xmlns.com\/foaf\/0.1\/ ?x ?type)\n-&gt; querySparql('\nCONSTRUCT   { ?x1 rdfs:label ?label }\nWHERE       { graph ?g {  ?x1 rdfs:label ?label. FILTER (?x1 = foaf:name) } }\n')\n]\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>a recent blog-post by Dan Brickley reminded me that we have a Jena-Rule engine augmented with SPARQL dusting our shelves. Its years old, but may be interesting for you. We augmented Jena&#8217;s rules by adding sparql. The passing of parameters is easy, you just have to use the variables of the rules. Within Jena rules, &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Combining Rules with SPARQL&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_bluesky_dont_syndicate":"","_bluesky_syndication_accounts":"","_bluesky_syndication_text":"","activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[5],"tags":[],"class_list":["post-1817","post","type-post","status-publish","format-standard","hentry","category-semweb"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Combining Rules with SPARQL - Leobard&#039;s blog<\/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.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Combining Rules with SPARQL - Leobard&#039;s blog\" \/>\n<meta property=\"og:description\" content=\"a recent blog-post by Dan Brickley reminded me that we have a Jena-Rule engine augmented with SPARQL dusting our shelves. Its years old, but may be interesting for you. We augmented Jena&#8217;s rules by adding sparql. The passing of parameters is easy, you just have to use the variables of the rules. Within Jena rules, &hellip; Continue reading &quot;Combining Rules with SPARQL&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/\" \/>\n<meta property=\"og:site_name\" content=\"Leobard&#039;s blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/leobard\" \/>\n<meta property=\"article:published_time\" content=\"2008-01-25T09:18:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-11-04T15:47:36+00:00\" \/>\n<meta name=\"author\" content=\"leobard\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"leobard\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. 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.leobard.net\\\/blog\\\/2008\\\/01\\\/25\\\/combining-rules-with-sparql\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/2008\\\/01\\\/25\\\/combining-rules-with-sparql\\\/\"},\"author\":{\"name\":\"leobard\",\"@id\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/#\\\/schema\\\/person\\\/23f718c5d3bd8d343befaa1b11bdc609\"},\"headline\":\"Combining Rules with SPARQL\",\"datePublished\":\"2008-01-25T09:18:00+00:00\",\"dateModified\":\"2017-11-04T15:47:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/2008\\\/01\\\/25\\\/combining-rules-with-sparql\\\/\"},\"wordCount\":634,\"commentCount\":0,\"articleSection\":[\"SemWeb\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.leobard.net\\\/blog\\\/2008\\\/01\\\/25\\\/combining-rules-with-sparql\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/2008\\\/01\\\/25\\\/combining-rules-with-sparql\\\/\",\"url\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/2008\\\/01\\\/25\\\/combining-rules-with-sparql\\\/\",\"name\":\"Combining Rules with SPARQL - Leobard&#039;s blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/#website\"},\"datePublished\":\"2008-01-25T09:18:00+00:00\",\"dateModified\":\"2017-11-04T15:47:36+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/#\\\/schema\\\/person\\\/23f718c5d3bd8d343befaa1b11bdc609\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/2008\\\/01\\\/25\\\/combining-rules-with-sparql\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.leobard.net\\\/blog\\\/2008\\\/01\\\/25\\\/combining-rules-with-sparql\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/2008\\\/01\\\/25\\\/combining-rules-with-sparql\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Combining Rules with SPARQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/\",\"name\":\"Leobard&#039;s blog\",\"description\":\"personal weblog of Leo Sauermann\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/#\\\/schema\\\/person\\\/23f718c5d3bd8d343befaa1b11bdc609\",\"name\":\"leobard\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4f15ee76fffcb732371d121c4713809a3f075186c6223630d4fe6c82ae88166d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4f15ee76fffcb732371d121c4713809a3f075186c6223630d4fe6c82ae88166d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4f15ee76fffcb732371d121c4713809a3f075186c6223630d4fe6c82ae88166d?s=96&d=mm&r=g\",\"caption\":\"leobard\"},\"description\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/about-leo-sauermann\\\/\",\"sameAs\":[\"https:\\\/\\\/www.leobard.net\\\/\",\"https:\\\/\\\/www.facebook.com\\\/leobard\",\"https:\\\/\\\/www.instagram.com\\\/leobarder\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/leosauermann\\\/\"],\"url\":\"https:\\\/\\\/www.leobard.net\\\/blog\\\/author\\\/leobard\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Combining Rules with SPARQL - Leobard&#039;s blog","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.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/","og_locale":"en_US","og_type":"article","og_title":"Combining Rules with SPARQL - Leobard&#039;s blog","og_description":"a recent blog-post by Dan Brickley reminded me that we have a Jena-Rule engine augmented with SPARQL dusting our shelves. Its years old, but may be interesting for you. We augmented Jena&#8217;s rules by adding sparql. The passing of parameters is easy, you just have to use the variables of the rules. Within Jena rules, &hellip; Continue reading \"Combining Rules with SPARQL\"","og_url":"https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/","og_site_name":"Leobard&#039;s blog","article_author":"https:\/\/www.facebook.com\/leobard","article_published_time":"2008-01-25T09:18:00+00:00","article_modified_time":"2017-11-04T15:47:36+00:00","author":"leobard","twitter_card":"summary_large_image","twitter_misc":{"Written by":"leobard","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/#article","isPartOf":{"@id":"https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/"},"author":{"name":"leobard","@id":"https:\/\/www.leobard.net\/blog\/#\/schema\/person\/23f718c5d3bd8d343befaa1b11bdc609"},"headline":"Combining Rules with SPARQL","datePublished":"2008-01-25T09:18:00+00:00","dateModified":"2017-11-04T15:47:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/"},"wordCount":634,"commentCount":0,"articleSection":["SemWeb"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/","url":"https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/","name":"Combining Rules with SPARQL - Leobard&#039;s blog","isPartOf":{"@id":"https:\/\/www.leobard.net\/blog\/#website"},"datePublished":"2008-01-25T09:18:00+00:00","dateModified":"2017-11-04T15:47:36+00:00","author":{"@id":"https:\/\/www.leobard.net\/blog\/#\/schema\/person\/23f718c5d3bd8d343befaa1b11bdc609"},"breadcrumb":{"@id":"https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.leobard.net\/blog\/2008\/01\/25\/combining-rules-with-sparql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.leobard.net\/blog\/"},{"@type":"ListItem","position":2,"name":"Combining Rules with SPARQL"}]},{"@type":"WebSite","@id":"https:\/\/www.leobard.net\/blog\/#website","url":"https:\/\/www.leobard.net\/blog\/","name":"Leobard&#039;s blog","description":"personal weblog of Leo Sauermann","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.leobard.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.leobard.net\/blog\/#\/schema\/person\/23f718c5d3bd8d343befaa1b11bdc609","name":"leobard","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/4f15ee76fffcb732371d121c4713809a3f075186c6223630d4fe6c82ae88166d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/4f15ee76fffcb732371d121c4713809a3f075186c6223630d4fe6c82ae88166d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4f15ee76fffcb732371d121c4713809a3f075186c6223630d4fe6c82ae88166d?s=96&d=mm&r=g","caption":"leobard"},"description":"https:\/\/www.leobard.net\/blog\/about-leo-sauermann\/","sameAs":["https:\/\/www.leobard.net\/","https:\/\/www.facebook.com\/leobard","https:\/\/www.instagram.com\/leobarder\/","https:\/\/www.linkedin.com\/in\/leosauermann\/"],"url":"https:\/\/www.leobard.net\/blog\/author\/leobard\/"}]}},"_links":{"self":[{"href":"https:\/\/www.leobard.net\/blog\/wp-json\/wp\/v2\/posts\/1817","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.leobard.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leobard.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leobard.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leobard.net\/blog\/wp-json\/wp\/v2\/comments?post=1817"}],"version-history":[{"count":1,"href":"https:\/\/www.leobard.net\/blog\/wp-json\/wp\/v2\/posts\/1817\/revisions"}],"predecessor-version":[{"id":2603,"href":"https:\/\/www.leobard.net\/blog\/wp-json\/wp\/v2\/posts\/1817\/revisions\/2603"}],"wp:attachment":[{"href":"https:\/\/www.leobard.net\/blog\/wp-json\/wp\/v2\/media?parent=1817"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leobard.net\/blog\/wp-json\/wp\/v2\/categories?post=1817"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leobard.net\/blog\/wp-json\/wp\/v2\/tags?post=1817"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}