{"id":2626,"date":"2023-01-12T08:29:42","date_gmt":"2023-01-12T13:29:42","guid":{"rendered":"https:\/\/www.dpriver.com\/blog\/?p=2626"},"modified":"2023-02-23T10:09:17","modified_gmt":"2023-02-23T15:09:17","slug":"instantly-get-the-data-lineage-from-complex-sql-statements","status":"publish","type":"post","link":"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/","title":{"rendered":"Instantly get the data lineage from complex SQL statements"},"content":{"rendered":"\n<p>Data lineage plays an important role in Data Governance, you can refer to <a href=\"https:\/\/www.gudusoft.com\/whats-data-lineage-why-important\/\">this blog<\/a> for why data lineage is so important for an enterprise and how can we correctly use the data lineage. In this article, we will introduce how to use Gudu SQLFlow UI, SQLFlow Rest API and SQLFlow Java library to retrieve data lineage from complex SQL statements with which you can potentially integrate in your own data governance platform.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"800\" height=\"557\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-5.png\" alt=\"\" class=\"wp-image-2632\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-5.png 800w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-5-300x209.png 300w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-5-768x535.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>                                           Automation with SQLFlow in building data lineage<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">A complex SQL statement example<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>select data.*, location.remote\nfrom (\n\tselect e.last_name, e.department_id, d.department_name\n\tfrom employees e\n\tleft outer join department d\n\t\ton (e.department_id = d.department_id)\n) data inner join\n(\n\tselect s.remote,s.department_id \n\tfrom source s\n\tinner join location l \n\ton s.location_id = l.id\n) location on data.department_id = location.department_id;<\/code><\/pre>\n\n\n\n<p>Above SQL has some complexities and let&#8217;s take this SQL statement as an example source of retrieving data lineage with SQLFlow. Note that in the real situation, our SQL statements might be far more complicated than this example especially when we have views or stored procedures to deal with.<\/p>\n\n\n\n<p>To generate the correspond data lineage, we need to know which fields or columns are included in the top-level select list, and what is the data source for these fields or columns comes from. After some analysis, an ideal result should be as shown in the figure below:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"426\" height=\"225\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-6.png\" alt=\"\" class=\"wp-image-2634\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-6.png 426w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-6-300x158.png 300w\" sizes=\"(max-width: 426px) 100vw, 426px\" \/><figcaption>                Data Lineage for Top Level Select List<\/figcaption><\/figure>\n\n\n\n<p>To archive the above results, we have to:<\/p>\n\n\n\n<p>1.Expand the asterisk (<code>*<\/code> in the SQL statement) in <code>data.*<\/code> to find the corresponding fields<\/p>\n\n\n\n<p>The asterisk in the <code>Select <\/code>list stands for all fields of the relation, we will need to retrieve the exact fields to generate the data lineage. In this example, Gudu SQLFlow is able to get the fields info based on the contextual information provided in the SQL statement. Nevertheless, most of SQL statements are not able to provide sufficient information for us to detect what are the fields in the relation of the asterisk. In that case, giving metadata would be necessary to generate the result. You can refer to <a href=\"https:\/\/www.gudusoft.com\/blog\/gsp-sqlenv\/\">this article<\/a> for how to get metadata.<\/p>\n\n\n\n<p>2.Perform data tracing for each field in the <code>select <\/code>list to find the original tables and fields. This process may require multi-level tracing until we find the final data source as the result.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gudu SQLFlow UI<\/h2>\n\n\n\n<p>You can check our online <a href=\"https:\/\/sqlflow.gudusoft.com\">Gudu SQLFlow Cloud<\/a>. This is probably the most easiest way to instantly archive data lineage cause no toolkit or software is required on your side. The usage is quite simple, directly paste the SQL statement to be processed to the input area, and then click Visualize button.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"350\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-7.png\" alt=\"\" class=\"wp-image-2637\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-7.png 1024w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-7-300x103.png 300w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-7-768x263.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>                                                          Gudu SQLFlow Data Lineage<\/figcaption><\/figure>\n\n\n\n<p>If you prefer to not display the intermediate processing steps in the data lineage, you can show the source data with target data by config the setting as:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"338\" height=\"285\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-8.png\" alt=\"\" class=\"wp-image-2638\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-8.png 338w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-8-300x253.png 300w\" sizes=\"(max-width: 338px) 100vw, 338px\" \/><figcaption>                Gudu SQLFlow Setting<\/figcaption><\/figure>\n\n\n\n<p>Download the data lineage in Json for further processing:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"732\" height=\"620\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-9.png\" alt=\"\" class=\"wp-image-2639\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-9.png 732w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-9-300x254.png 300w\" sizes=\"(max-width: 732px) 100vw, 732px\" \/><figcaption>                                                Gudu SQLFlow Data Lineage in JSON<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Gudu SQLFlow Rest API<\/h2>\n\n\n\n<p>Calling SQLFlow Rest API in your code to instantly get the data lineage from SQL statements. You can embed the request in your code and processing the result after getting the Rest Api response.<\/p>\n\n\n\n<p>A <a href=\"https:\/\/www.gudusoft.com\/purchase-premium-account\/\">Gudu SQLFlow Cloud Premium Account<\/a> is required to use the Rest Api feature. Check our docs <a href=\"https:\/\/docs.gudusoft.com\/3.-api-docs\/using-the-rest-api\">here<\/a> to get the way of calling our Rest Api. <\/p>\n\n\n\n<p>You will also need to <a href=\"https:\/\/docs.gudusoft.com\/1.-introduction\/installation\">install SQLFlow On-Premise<\/a> on your server if you would like to use SQLFlow internally. <\/p>\n\n\n\n<p>You can also check our sample code, the sample code is in Python:<\/p>\n\n\n\n<ul><li><a href=\"https:\/\/github.com\/sqlparser\/sqlflow_public\/blob\/master\/demos\/top-level-select-list\/lineage_on_premise.py\">Sample code<\/a> of connecting to the Gudu SQLFlow server ( Gudu SQLFlow on-premise server ) deployed on your own server.<\/li><li><a href=\"https:\/\/github.com\/sqlparser\/sqlflow_public\/blob\/master\/demos\/top-level-select-list\/lineage_cloud.py\">Sample code<\/a> with SQLFlow public cloud server<\/li><\/ul>\n\n\n\n<p>Check <a href=\"https:\/\/github.com\/sqlparser\/sqlflow_public\/blob\/master\/demos\/top-level-select-list\/data-lineage-json-by-python.json\">here<\/a> for the data lineage generated by the above sample code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gudu SQLFlow Java library<\/h2>\n\n\n\n<p>Use the <a href=\"https:\/\/www.gudusoft.com\/sqlflow-java-library-2\/\">Gudu SQLFlow Java library<\/a> to analyze the SQL statements and get the data lineage. The advantage of using the Gudu SQLFlow Java class library is that you don&#8217;t need to install the Gudu SQLFlow server software and it can be executed independently without relying on any third-party Java class library, easy to integrate into your own project.<\/p>\n\n\n\n<p>We&#8217;ve prepared a <a href=\"https:\/\/docs.gudusoft.com\/1.-introduction\/java-library\">Java file<\/a> for you which you can directly use without compilation as long as you have Java install on your machine. To get the <code>select<\/code> list in the above example, you can run the Java file with the following parameters:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/s \/topselectlist<\/code><\/pre>\n\n\n\n<p>The result by default is in XML. Check <a href=\"https:\/\/github.com\/sqlparser\/sqlflow_public\/blob\/master\/demos\/top-level-select-list\/data-lineage-xml-by-java-dlineage.xml\">here<\/a> for the result of the execution. You can config the result in Json as well by adding the <code>\/json<\/code> flag.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Data lineage plays an important role in Data Governance, you can refer to this blog for why data lineage is so important for an enterprise and how can we correctly use the data lineage. In this article, we will introduce how to use Gudu SQLFlow UI, SQLFlow Rest API and SQLFlow Java library to retrieve data lineage from complex SQL statements with which you can potentially integrate in your own data governance platform. A complex SQL statement example Above SQL has some complexities and let&#8217;s take this SQL statement as an example source of retrieving data lineage with SQLFlow. Note\u2026<\/p>\n","protected":false},"author":6,"featured_media":2673,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[66,93],"tags":[],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":5}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Instantly get the data lineage from complex SQL statements<\/title>\n<meta name=\"description\" content=\"Use SQLFlow UI, SQLFlow Rest API, SQLFlow Java library to instantly get the data lineage from complex SQL statements\" \/>\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.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Instantly get the data lineage from complex SQL statements\" \/>\n<meta property=\"og:description\" content=\"Use SQLFlow UI, SQLFlow Rest API, SQLFlow Java library to instantly get the data lineage from complex SQL statements\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/\" \/>\n<meta property=\"og:site_name\" content=\"SQL and Data Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-12T13:29:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-23T15:09:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-5-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"557\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"leo gu\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"leo gu\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/#organization\",\"name\":\"SQL and Data Blog\",\"url\":\"https:\/\/www.dpriver.com\/blog\/\",\"sameAs\":[],\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2022\/07\/sqlpp-character.png\",\"contentUrl\":\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2022\/07\/sqlpp-character.png\",\"width\":251,\"height\":72,\"caption\":\"SQL and Data Blog\"},\"image\":{\"@id\":\"https:\/\/www.dpriver.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/#website\",\"url\":\"https:\/\/www.dpriver.com\/blog\/\",\"name\":\"SQL and Data Blog\",\"description\":\"SQL related blog for database professional\",\"publisher\":{\"@id\":\"https:\/\/www.dpriver.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dpriver.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/\",\"url\":\"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/\",\"name\":\"Instantly get the data lineage from complex SQL statements\",\"isPartOf\":{\"@id\":\"https:\/\/www.dpriver.com\/blog\/#website\"},\"datePublished\":\"2023-01-12T13:29:42+00:00\",\"dateModified\":\"2023-02-23T15:09:17+00:00\",\"description\":\"Use SQLFlow UI, SQLFlow Rest API, SQLFlow Java library to instantly get the data lineage from complex SQL statements\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.dpriver.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Instantly get the data lineage from complex SQL statements\"}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/\"},\"author\":{\"name\":\"leo gu\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/#\/schema\/person\/9e80d249b6da4e572bd8590b0789bc14\"},\"headline\":\"Instantly get the data lineage from complex SQL statements\",\"datePublished\":\"2023-01-12T13:29:42+00:00\",\"dateModified\":\"2023-02-23T15:09:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/\"},\"wordCount\":719,\"publisher\":{\"@id\":\"https:\/\/www.dpriver.com\/blog\/#organization\"},\"articleSection\":[\"Data Governance\",\"SQLFlow\"],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/#\/schema\/person\/9e80d249b6da4e572bd8590b0789bc14\",\"name\":\"leo gu\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/24976e2e4ca7dd476652bb26bd09392b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/24976e2e4ca7dd476652bb26bd09392b?s=96&d=mm&r=g\",\"caption\":\"leo gu\"},\"url\":\"https:\/\/www.dpriver.com\/blog\/author\/guyuanhao\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Instantly get the data lineage from complex SQL statements","description":"Use SQLFlow UI, SQLFlow Rest API, SQLFlow Java library to instantly get the data lineage from complex SQL statements","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.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/","og_locale":"en_US","og_type":"article","og_title":"Instantly get the data lineage from complex SQL statements","og_description":"Use SQLFlow UI, SQLFlow Rest API, SQLFlow Java library to instantly get the data lineage from complex SQL statements","og_url":"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/","og_site_name":"SQL and Data Blog","article_published_time":"2023-01-12T13:29:42+00:00","article_modified_time":"2023-02-23T15:09:17+00:00","og_image":[{"width":800,"height":557,"url":"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/01\/image-5-1.png","type":"image\/png"}],"author":"leo gu","twitter_card":"summary_large_image","twitter_misc":{"Written by":"leo gu","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Organization","@id":"https:\/\/www.dpriver.com\/blog\/#organization","name":"SQL and Data Blog","url":"https:\/\/www.dpriver.com\/blog\/","sameAs":[],"logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dpriver.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2022\/07\/sqlpp-character.png","contentUrl":"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2022\/07\/sqlpp-character.png","width":251,"height":72,"caption":"SQL and Data Blog"},"image":{"@id":"https:\/\/www.dpriver.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"WebSite","@id":"https:\/\/www.dpriver.com\/blog\/#website","url":"https:\/\/www.dpriver.com\/blog\/","name":"SQL and Data Blog","description":"SQL related blog for database professional","publisher":{"@id":"https:\/\/www.dpriver.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dpriver.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/","url":"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/","name":"Instantly get the data lineage from complex SQL statements","isPartOf":{"@id":"https:\/\/www.dpriver.com\/blog\/#website"},"datePublished":"2023-01-12T13:29:42+00:00","dateModified":"2023-02-23T15:09:17+00:00","description":"Use SQLFlow UI, SQLFlow Rest API, SQLFlow Java library to instantly get the data lineage from complex SQL statements","breadcrumb":{"@id":"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.dpriver.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Instantly get the data lineage from complex SQL statements"}]},{"@type":"Article","@id":"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/#article","isPartOf":{"@id":"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/"},"author":{"name":"leo gu","@id":"https:\/\/www.dpriver.com\/blog\/#\/schema\/person\/9e80d249b6da4e572bd8590b0789bc14"},"headline":"Instantly get the data lineage from complex SQL statements","datePublished":"2023-01-12T13:29:42+00:00","dateModified":"2023-02-23T15:09:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dpriver.com\/blog\/instantly-get-the-data-lineage-from-complex-sql-statements\/"},"wordCount":719,"publisher":{"@id":"https:\/\/www.dpriver.com\/blog\/#organization"},"articleSection":["Data Governance","SQLFlow"],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dpriver.com\/blog\/#\/schema\/person\/9e80d249b6da4e572bd8590b0789bc14","name":"leo gu","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dpriver.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/24976e2e4ca7dd476652bb26bd09392b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/24976e2e4ca7dd476652bb26bd09392b?s=96&d=mm&r=g","caption":"leo gu"},"url":"https:\/\/www.dpriver.com\/blog\/author\/guyuanhao\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/posts\/2626"}],"collection":[{"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/comments?post=2626"}],"version-history":[{"count":11,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/posts\/2626\/revisions"}],"predecessor-version":[{"id":2642,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/posts\/2626\/revisions\/2642"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/media\/2673"}],"wp:attachment":[{"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/media?parent=2626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/categories?post=2626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/tags?post=2626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}