{"id":2821,"date":"2023-04-11T04:43:24","date_gmt":"2023-04-11T09:43:24","guid":{"rendered":"https:\/\/www.dpriver.com\/blog\/?p=2821"},"modified":"2023-04-11T04:52:45","modified_gmt":"2023-04-11T09:52:45","slug":"visualize-your-upstream-downstream-data-with-sqlflow-rest-api","status":"publish","type":"post","link":"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/","title":{"rendered":"Visualize your upstream\/downstream data with SQLFlow REST API"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/www.gudusoft.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Gudu SQLFlow<\/a><\/strong> is an analysis software for analyzing SQL statements and discovering <strong><a href=\"https:\/\/www.dpriver.com\/blog\/2022\/05\/11\/best-data-lineage-tools\/\" target=\"_blank\" rel=\"noreferrer noopener\">data lineage<\/a><\/strong> relationships. It is often used with <a href=\"https:\/\/www.gudusoft.com\/what-is-metadata-management\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>metadata management<\/strong><\/a> tools and is a basic tool for <a href=\"https:\/\/www.gudusoft.com\/challenges-facing-enterprise-data-governance\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>enterprise data governance<\/strong><\/a>. Check <a href=\"https:\/\/www.dpriver.com\/blog\/2022\/08\/20\/introduction-of-gudu-sqlflow\/\" target=\"_blank\" rel=\"noreferrer noopener\">this introduction blog<\/a> if you don\u2019t know much about Gudu SQLFlow.<\/p>\n\n\n\n<p>When dealing with complex SQL statements, we can check the data upstream or data downstream analysis by using the to <strong>upstream\/to downstream<\/strong> feature of SQLFlow.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">To upstream\/downstream<\/h2>\n\n\n\n<p>SQLFlow UI provides the upstream\/downstream data analysis in <strong><a href=\"https:\/\/docs.gudusoft.com\/1.-introduction\/getting-started\/different-modes-in-gudu-sqlflow\/job-mode\">regular SQLFlow Job<\/a><\/strong> by right clicking the data element.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"232\" height=\"295\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u56fe\u7247-2.png\" alt=\"\" class=\"wp-image-2824\" \/><\/figure>\n\n\n\n<p>The upstream of the data gives the source lineage for the selected data. Given full data lineage <code>a -&gt; b -&gt; c<\/code>, if data element b is selected for its upstream, the upstream lineage would be <code>a -&gt; b<\/code>.<\/p>\n\n\n\n<p>On the contrary, the downstream of the data returns the affected lineage for the selected data. Given full data lineage <code>a -&gt; b -&gt; c<\/code>, if data element b is selected for its upstream, the upstream lineage would be <code>b -&gt; c<\/code>.<\/p>\n\n\n\n<p>Let&#8217;s take the following data lineage as an example:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"150\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143258-1024x150.png\" alt=\"\" class=\"wp-image-2826\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143258-1024x150.png 1024w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143258-300x44.png 300w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143258-768x112.png 768w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143258.png 1353w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The upstream of the hr.dbo.countries would be: <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"433\" height=\"85\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143318.png\" alt=\"\" class=\"wp-image-2827\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143318.png 433w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143318-300x59.png 300w\" sizes=\"(max-width: 433px) 100vw, 433px\" \/><\/figure>\n\n\n\n<p>The downstream of the hr.dbo.countries is:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"137\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143335-1024x137.png\" alt=\"\" class=\"wp-image-2828\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143335-1024x137.png 1024w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143335-300x40.png 300w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143335-768x103.png 768w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411143335.png 1127w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">SQLFlow REST API<\/h2>\n\n\n\n<p>Gudu SQLFlow has various functionalities for data lineage generation and it provides you different choices to visualize your data. <a href=\"https:\/\/docs.gudusoft.com\/3.-api-docs\/using-the-rest-api\" target=\"_blank\" rel=\"noreferrer noopener\">SQLFlow REST API<\/a> is one of the most commonly used features. Your data analysis result will be generated and returned from SQLFlow server by sending standard parameterized RESTFul Api request. Apart from report under <strong><em>Json<\/em><\/strong>, <strong><em>XML<\/em><\/strong>, <strong><em>CSV <\/em><\/strong>format, SQLFlow REST API is also able to return result as <strong>image(PNG\/JPEG)<\/strong> from your SQL.<\/p>\n\n\n\n<p>To visualize the data lineage upstream\/downstream with SQLFlow REST API, we need to invoke<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/sqlflow\/generation\/sqlflow\/upstreamGraph\/image<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/sqlflow\/generation\/sqlflow\/downstreamGraph\/image<\/code><\/pre>\n\n\n\n<p>These two endpoints take <code>sessionId<\/code> as input. There are two ways to get <code>sessionId<\/code>:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Invoke data lineage API to get sessionId<\/h3>\n\n\n\n<p>Sample:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl --location 'https:\/\/&lt;SQLFlow url&gt;\/gspLive_backend\/sqlflow\/generation\/sqlflow\/graph' \\\n--header 'accept: application\/json;charset=utf-8' \\\n--form 'sqlfile=@\"\/home\/workspace\/test2.sql\"' \\\n--form 'dbvendor=\"dbvoracle\"' \\\n--form 'userId=\"gudu|0123456789\"'<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"895\" height=\"1024\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411102330-895x1024.png\" alt=\"\" class=\"wp-image-2808\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411102330-895x1024.png 895w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411102330-262x300.png 262w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411102330-768x879.png 768w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411102330.png 1062w\" sizes=\"(max-width: 895px) 100vw, 895px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2. Create SQLFlow Job<\/h3>\n\n\n\n<p>The following endpoint is to create a SQLFlow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/sqlflow\/job\/submitUserJob<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"1016\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181459-1024x1016.png\" alt=\"\" class=\"wp-image-2799\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181459-1024x1016.png 1024w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181459-300x298.png 300w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181459-150x150.png 150w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181459-768x762.png 768w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181459.png 1218w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Wait few seconds and If we check our job list, we should have this <em>demoJob2<\/em> in our job success list. You can verify that ethiter go to the SQLFlow interface or use another SQLFlow REST API <code>\/sqlflow\/job\/displayUserJobsSummary<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"345\" height=\"103\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181243.png\" alt=\"\" class=\"wp-image-2798\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181243.png 345w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181243-300x90.png 300w\" sizes=\"(max-width: 345px) 100vw, 345px\" \/><\/figure>\n\n\n\n<p>Great! After checking the SQLFlow web, we have confirmed the SQLFlow Job is succeeded.<\/p>\n\n\n\n<p>Now we have our Job created and we need to select our data now. To do that, invoke:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/sqlflow\/job\/displayUserJobGraph<\/code><\/pre>\n\n\n\n<p>Give the Job Id as the input and in the response of the above API, we will have the sessionId:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"986\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181530-1024x986.png\" alt=\"\" class=\"wp-image-2800\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181530-1024x986.png 1024w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181530-300x289.png 300w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181530-768x740.png 768w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230410181530.png 1248w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Get upstream\/downstream lineage <\/h2>\n\n\n\n<p>Now we are good to invoke the upstream\/downstream SQLFlow Api with the <code>sessionId<\/code> ready. You can use <code>tableNamePattern<\/code> to map the desired table. By default the top SQLFlow Job is taken If sessionId is not given. Full parameter table:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Field name<\/strong><\/td><td><strong>Type<\/strong><\/td><td><strong>Description<\/strong><\/td><\/tr><tr><td>dbvendor<\/td><td>string<\/td><td>database vendor, support values: \u2013 dbvazuresql<br>\u2013 dbvbigquery<br>\u2013 dbvcouchbase<br>\u2013 dbvdb2<br>\u2013 dbvgreenplum<br>\u2013 dbvhana<br>\u2013 dbvhive<br>\u2013 dbvimpala<br>\u2013 dbvinformix<br>\u2013 dbvmdx<br>\u2013 dbvmysql<br>\u2013 dbvnetezza<br>\u2013 dbvopenedge<br>\u2013 dbvoracle<br>\u2013 dbvpostgresql<br>\u2013 dbvredshift<br>\u2013 dbvsnowflake<br>\u2013 dbvmssql<br>\u2013 dbvsparksql<br>\u2013 dbvsybase<br>\u2013 dbvteradata<br>\u2013 dbvvertica<\/td><\/tr><tr><td>hideColumn<\/td><td>boolean<\/td><td>whether hide column<\/td><\/tr><tr><td>ignoreFunction<\/td><td>boolean<\/td><td>whether ignore function<\/td><\/tr><tr><td>simpleOutput<\/td><td>boolean<\/td><td>simple output, ignore the intermediate results, defualt is false.<\/td><\/tr><tr><td>ignoreRecordSet<\/td><td>boolean<\/td><td>same as simpleOutput, but will keep output of the top level select<br>list, default is false.<\/td><\/tr><tr><td>jobId<\/td><td>string<\/td><td>give the job Id if need to use the job settings and display the<br>job graph<\/td><\/tr><tr><td>normalizeIdentifier<\/td><td>boolean<\/td><td>whether normalize the Identifier, default is true<\/td><\/tr><tr><td>showTransform<\/td><td>boolean<\/td><td>whether show transform<\/td><\/tr><tr><td>token<\/td><td>string<\/td><td>The token is only used when connecting to the SQLFlow Cloud server,<br>It\u2019s not in use when connect to the SQLFlow on-premise version.<\/td><\/tr><tr><td>treatArgumentsInCountFunctionAsDirectDataflow<\/td><td>boolean<\/td><td>Whether treat the arguments in COUNT function as direct Dataflow<\/td><\/tr><tr><td>userId<\/td><td>string<\/td><td>the user id of sqlflow web or client<\/td><\/tr><tr><td>isReturnModel<\/td><td>boolean<\/td><td>whether to return model<\/td><\/tr><tr><td>sessionId<\/td><td>string<\/td><td>the graph session Id<\/td><\/tr><tr><td>showConstantTable<\/td><td>boolean<\/td><td>whether show constant table<\/td><\/tr><tr><td>showLinkOnly<\/td><td>boolean<\/td><td>whether show link only<\/td><\/tr><tr><td>showRelationType<\/td><td>string<\/td><td>show relation type, required false, default value is \u2018fdd\u2019, multiple<br>values seperated by comma like fdd,frd,fdr,join. Availables are \u2018fdd\u2019 value<br>of target column from source column, \u2018frd\u2019 the recordset count of target<br>column which is affected by value of source column, \u2018fdr\u2019 value of target<br>column which is affected by the recordset count of source column, \u2018join\u2019<br>combines rows from two or more tables, based on a related column between<br>them<\/td><\/tr><tr><td>tableColumn<\/td><td>string<\/td><td>target table column<\/td><\/tr><tr><td>tableNamePattern<\/td><td>string<\/td><td>target table name, supports regex expression<\/td><\/tr><tr><td>distance<\/td><td>integer<\/td><td>graph element distance<\/td><\/tr><tr><td>stopat<\/td><td>string<\/td><td>stop at <\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Upstream Sample:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl --location 'https:\/\/&lt;SQLFlow URL&gt;\/gspLive_backend\/sqlflow\/generation\/sqlflow\/upstreamGraph\/image' \\\n--header 'accept: image\/*' \\\n--form 'userId=\"gudu|0123456789\"' \\\n--form 'sessionId=\"de3882d463c247ce82c2552d260f3661_1681194645814\"' \\\n--form 'dbvendor=\"dbvmssql\"' \\\n--form 'jobId=\"de3882d463c247ce82c2552d260f3661\"' \\\n--form 'tableNamePattern=\"hr.dbo.countries\"'<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"954\" height=\"746\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411173853.png\" alt=\"\" class=\"wp-image-2833\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411173853.png 954w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411173853-300x235.png 300w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411173853-768x601.png 768w\" sizes=\"(max-width: 954px) 100vw, 954px\" \/><\/figure>\n\n\n\n<p><strong>Downstream Sample:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl --location 'https:\/\/&lt;SQLFlow URL&gt;\/gspLive_backend\/sqlflow\/generation\/sqlflow\/downstreamGraph\/image' \\\n--header 'accept: image\/*' \\\n--form 'userId=\"gudu|0123456789\"' \\\n--form 'sessionId=\"de3882d463c247ce82c2552d260f3661_1681194645814\"' \\\n--form 'dbvendor=\"dbvmssql\"' \\\n--form 'jobId=\"de3882d463c247ce82c2552d260f3661\"' \\\n--form 'tableNamePattern=\"hr.dbo.countries\"'<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"704\" src=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411174044-1024x704.png\" alt=\"\" class=\"wp-image-2834\" srcset=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411174044-1024x704.png 1024w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411174044-300x206.png 300w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411174044-768x528.png 768w, https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2023\/04\/\u5fae\u4fe1\u622a\u56fe_20230411174044.png 1180w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Gudu SQLFlow is an analysis software for analyzing SQL statements and discovering data lineage relationships. It is often used with metadata management tools and is a basic tool for enterprise data governance. Check this introduction blog if you don\u2019t know much about Gudu SQLFlow. When dealing with complex SQL statements, we can check the data upstream or data downstream analysis by using the to upstream\/to downstream feature of SQLFlow. To upstream\/downstream SQLFlow UI provides the upstream\/downstream data analysis in regular SQLFlow Job by right clicking the data element. The upstream of the data gives the source lineage for the selected\u2026<\/p>\n","protected":false},"author":6,"featured_media":2358,"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>Visualize your upstream\/downstream data with SQLFlow REST API<\/title>\n<meta name=\"description\" content=\"Visualize your upstream\/downstream data with SQLFlow REST API\" \/>\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\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Visualize your upstream\/downstream data with SQLFlow REST API\" \/>\n<meta property=\"og:description\" content=\"Visualize your upstream\/downstream data with SQLFlow REST API\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/\" \/>\n<meta property=\"og:site_name\" content=\"SQL and Data Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-11T09:43:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-11T09:52:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2022\/07\/Best_Data_Quality_Tools-3.png\" \/>\n\t<meta property=\"og:image:width\" content=\"949\" \/>\n\t<meta property=\"og:image:height\" content=\"514\" \/>\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=\"6 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\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/\",\"url\":\"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/\",\"name\":\"Visualize your upstream\/downstream data with SQLFlow REST API\",\"isPartOf\":{\"@id\":\"https:\/\/www.dpriver.com\/blog\/#website\"},\"datePublished\":\"2023-04-11T09:43:24+00:00\",\"dateModified\":\"2023-04-11T09:52:45+00:00\",\"description\":\"Visualize your upstream\/downstream data with SQLFlow REST API\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.dpriver.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Visualize your upstream\/downstream data with SQLFlow REST API\"}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/\"},\"author\":{\"name\":\"leo gu\",\"@id\":\"https:\/\/www.dpriver.com\/blog\/#\/schema\/person\/9e80d249b6da4e572bd8590b0789bc14\"},\"headline\":\"Visualize your upstream\/downstream data with SQLFlow REST API\",\"datePublished\":\"2023-04-11T09:43:24+00:00\",\"dateModified\":\"2023-04-11T09:52:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/\"},\"wordCount\":655,\"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":"Visualize your upstream\/downstream data with SQLFlow REST API","description":"Visualize your upstream\/downstream data with SQLFlow REST API","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\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/","og_locale":"en_US","og_type":"article","og_title":"Visualize your upstream\/downstream data with SQLFlow REST API","og_description":"Visualize your upstream\/downstream data with SQLFlow REST API","og_url":"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/","og_site_name":"SQL and Data Blog","article_published_time":"2023-04-11T09:43:24+00:00","article_modified_time":"2023-04-11T09:52:45+00:00","og_image":[{"width":949,"height":514,"url":"https:\/\/www.dpriver.com\/blog\/wp-content\/uploads\/2022\/07\/Best_Data_Quality_Tools-3.png","type":"image\/png"}],"author":"leo gu","twitter_card":"summary_large_image","twitter_misc":{"Written by":"leo gu","Est. reading time":"6 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\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/","url":"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/","name":"Visualize your upstream\/downstream data with SQLFlow REST API","isPartOf":{"@id":"https:\/\/www.dpriver.com\/blog\/#website"},"datePublished":"2023-04-11T09:43:24+00:00","dateModified":"2023-04-11T09:52:45+00:00","description":"Visualize your upstream\/downstream data with SQLFlow REST API","breadcrumb":{"@id":"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.dpriver.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Visualize your upstream\/downstream data with SQLFlow REST API"}]},{"@type":"Article","@id":"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/#article","isPartOf":{"@id":"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/"},"author":{"name":"leo gu","@id":"https:\/\/www.dpriver.com\/blog\/#\/schema\/person\/9e80d249b6da4e572bd8590b0789bc14"},"headline":"Visualize your upstream\/downstream data with SQLFlow REST API","datePublished":"2023-04-11T09:43:24+00:00","dateModified":"2023-04-11T09:52:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dpriver.com\/blog\/visualize-your-upstream-downstream-data-with-sqlflow-rest-api\/"},"wordCount":655,"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\/2821"}],"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=2821"}],"version-history":[{"count":9,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/posts\/2821\/revisions"}],"predecessor-version":[{"id":2836,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/posts\/2821\/revisions\/2836"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/media\/2358"}],"wp:attachment":[{"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/media?parent=2821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/categories?post=2821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dpriver.com\/blog\/wp-json\/wp\/v2\/tags?post=2821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}