{"id":14576,"date":"2022-03-22T09:30:26","date_gmt":"2022-03-22T13:30:26","guid":{"rendered":"https:\/\/enterprise-knowledge.com\/?p=14576"},"modified":"2025-09-03T14:02:59","modified_gmt":"2025-09-03T18:02:59","slug":"transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python","status":"publish","type":"post","link":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/","title":{"rendered":"Transforming Tabular Data into Personalized, Componentized Content using Knowledge Graphs in Python"},"content":{"rendered":"<p>My colleagues Joe Hilger and Neil Quinn recently wrote blogs highlighting the benefits of leveraging a knowledge graph in tandem with a componentized content management system (CCMS) to curate personalized content for users. Hilger <a href=\"https:\/\/enterprise-knowledge.com\/taking-content-personalization-to-the-next-level-graphs-and-componentized-content-management\/\"><strong>set the stage<\/strong><\/a> explaining the business value of a personalized digital experience and the logistics of these two technologies supporting one another to create it. Quinn<strong> <a href=\"https:\/\/enterprise-knowledge.com\/content-personalization-with-knowledge-graphs-in-python\/\">makes these concepts more tangible<\/a><\/strong> by processing sample data into a knowledge graph in Python and querying the graph to find tailored information for a particular user. This post will again show the creation and querying of a knowledge graph in Python, however, the same sample data will now be sourced from external CSV files.<\/p>\n<h2>A Quick Note on CSVs<\/h2>\n<p>CSV files, or comma-separated values files, are widely used to store tabular data. If your company uses spreadsheet applications, such as Microsoft Excel or Google Sheets, or relational databases, then it is likely you have encountered CSV files before. This post will help you use the already existent, CSV-formatted data throughout your company, transform it into a usable knowledge graph, and resurface relevant pieces of information to users in a CCMS. Although this example uses CSV files as the tabular dataset format, the same principles apply to Excel sheets and SQL tables alike.<\/p>\n<h2>Aggregating Data<\/h2>\n<p>The diagram below is a visual model of the knowledge graph we will create from data in our example CSV files.<\/p>\n<p><a href=\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-14362 size-full\" src=\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png\" alt=\"Diagram showing customers, products and parts\" width=\"1248\" height=\"588\" srcset=\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png 1248w, https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2-336x158.png 336w, https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2-771x363.png 771w, https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2-768x362.png 768w\" sizes=\"auto, (max-width: 1248px) 100vw, 1248px\" \/><\/a><\/p>\n<p>In order to populate this graph, just as in Quinn\u2019s blog, we will begin with three sets of data about:<\/p>\n<ul>\n<li aria-level=\"1\">Customers and the products they own<\/li>\n<li aria-level=\"1\">Products and the parts they are composed of<\/li>\n<li aria-level=\"1\">Parts and the actions that need to be taken on them<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">This information is stored in three CSV files, <\/span><b>Customer_Data.csv<\/b><span style=\"font-weight: 400;\">, <\/span><b>Product_Data.csv<\/b><span style=\"font-weight: 400;\"> and <\/span><b>Part_Data.csv<\/b><span style=\"font-weight: 400;\">:<\/span><\/p>\n<p><b>Customers<\/b><\/p>\n<table style=\"height: 93px; width: 88.5696%;\" border=\"1\">\n<tbody>\n<tr style=\"height: 19px;\">\n<td style=\"text-align: center;\">Customer ID<\/td>\n<td style=\"text-align: center;\">Customer Name<\/td>\n<td style=\"text-align: center;\">Owns Product<\/td>\n<\/tr>\n<tr style=\"height: 37px;\">\n<td style=\"text-align: left;\"><span style=\"font-weight: 400;\">1<\/span><\/td>\n<td>Stephen Smith<\/td>\n<td>Product A<\/td>\n<\/tr>\n<tr style=\"height: 37px;\">\n<td style=\"text-align: left;\"><span style=\"font-weight: 400;\">2<\/span><\/td>\n<td>Lisa Lu<\/td>\n<td>Product A<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b>Products<\/b><\/p>\n<table style=\"width: 88.5966%;\" border=\"1\">\n<tbody>\n<tr>\n<td style=\"width: 29.1845%; text-align: center;\"><b>Product ID<\/b><\/td>\n<td style=\"width: 35.9084%; text-align: center;\"><b>Product Name<\/b><\/td>\n<td style=\"width: 69.4352%; text-align: center;\"><b>Composed of<\/b><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 29.1845%; text-align: left;\"><span style=\"font-weight: 400;\">1<\/span><\/td>\n<td style=\"width: 35.9084%;\"><span style=\"font-weight: 400;\">Product A<\/span><\/td>\n<td style=\"width: 69.4352%;\"><span style=\"font-weight: 400;\">Part X<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 29.1845%; text-align: left;\"><span style=\"font-weight: 400;\">1<\/span><\/td>\n<td style=\"width: 35.9084%;\"><span style=\"font-weight: 400;\">Product A<\/span><\/td>\n<td style=\"width: 69.4352%;\"><span style=\"font-weight: 400;\">Part Y<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 29.1845%; text-align: left;\"><span style=\"font-weight: 400;\">1<\/span><\/td>\n<td style=\"width: 35.9084%;\"><span style=\"font-weight: 400;\">Product A<\/span><\/td>\n<td style=\"width: 69.4352%;\"><span style=\"font-weight: 400;\">Part Z<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b>Parts<\/b><\/p>\n<table style=\"width: 88.9265%; height: 144px;\" border=\"1\">\n<tbody>\n<tr style=\"height: 33px;\">\n<td style=\"height: 33px; width: 28.6558%; text-align: center;\"><b>Part ID<\/b><\/td>\n<td style=\"height: 33px; width: 36.9614%; text-align: center;\"><b>Part Name<\/b><\/td>\n<td style=\"height: 33px; width: 68.8669%; text-align: center;\"><b>Action<\/b><\/td>\n<\/tr>\n<tr style=\"height: 37px;\">\n<td style=\"height: 37px; width: 28.6558%; text-align: left;\"><span style=\"font-weight: 400;\">1<\/span><\/td>\n<td style=\"height: 37px; width: 36.9614%;\"><span style=\"font-weight: 400;\">Part X<\/span><\/td>\n<td style=\"height: 37px; width: 68.8669%;\"><\/td>\n<\/tr>\n<tr style=\"height: 37px;\">\n<td style=\"height: 37px; width: 28.6558%; text-align: left;\"><span style=\"font-weight: 400;\">2<\/span><\/td>\n<td style=\"height: 37px; width: 36.9614%;\"><span style=\"font-weight: 400;\">Part Y<\/span><\/td>\n<td style=\"height: 37px; width: 68.8669%;\"><\/td>\n<\/tr>\n<tr style=\"height: 37px;\">\n<td style=\"height: 37px; width: 28.6558%; text-align: left;\"><span style=\"font-weight: 400;\">3<\/span><\/td>\n<td style=\"height: 37px; width: 36.9614%;\"><span style=\"font-weight: 400;\">Part Z<\/span><\/td>\n<td style=\"height: 37px; width: 68.8669%;\"><span style=\"font-weight: 400;\">Recall<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>To create a knowledge graph from these tables, we will need to<\/p>\n<ul>\n<li aria-level=\"1\">Read the data tables from our CSV files into <a href=\"https:\/\/pandas.pydata.org\/docs\/user_guide\/dsintro.html#dataframe\">DataFrames<\/a> (an object representing a 2-D data structure, such as a spreadsheet or table)<\/li>\n<li aria-level=\"1\">Transform the DataFrames into RDF triples and add them to the graph<\/li>\n<\/ul>\n<p>In order to accomplish these two tasks, we will be utilizing two Python libraries. <a href=\"https:\/\/pandas.pydata.org\/docs\/\">Pandas<\/a>, a data analysis and manipulation library, will help us serialize our CSV files into DataFrames and <a href=\"https:\/\/rdflib.readthedocs.io\/en\/stable\/\">rdflib<\/a>, a library for working with RDF data, will allow us to create RDF triples from the data in our DataFrames.<\/p>\n<h2>Reading CSV Data<\/h2>\n<p><span style=\"font-weight: 400;\">This first task is quite easy to accomplish using pandas. Pandas has a <\/span><a href=\"https:\/\/pandas.pydata.org\/docs\/reference\/api\/pandas.read_csv.html#pandas.read_csv\"><span style=\"font-weight: 400;\">read_csv<\/span><\/a><span style=\"font-weight: 400;\"> method for ingesting CSV data into a DataFrame. For this use case, we only need to provide two parameters: the CSV\u2019s file path and the number of rows to read. To read the <\/span><a href=\"https:\/\/docs.google.com\/document\/d\/1wQJdop9N-po3G4v5dKoSWjbBG4qJEARaZhzSyrS-qGU\/edit#heading=h.qxx8u7xjfvin\"><span style=\"font-weight: 400;\">Customers<\/span><\/a><span style=\"font-weight: 400;\"> table from our <\/span><i><span style=\"font-weight: 400;\">Customer_Data.csv<\/span><\/i><span style=\"font-weight: 400;\"> file:<\/span><\/p>\n<pre>import pandas as pd\n\ncustomer_table = pd.read_csv(\"Customer_Data.csv\", nrows=2)<\/pre>\n<p>The value of <strong>customer_table<\/strong> is:<\/p>\n<pre>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Customer ID\u00a0 \u00a0 \u00a0 Customer Name \u00a0 \u00a0 Owns Product\n0\u00a0 \u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01 \u00a0\u00a0\u00a0\u00a0\u00a0Stephen Smith\u00a0 \u00a0 \u00a0 \u00a0 Product A\n1 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02 \u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Lisa Lu\u00a0 \u00a0 \u00a0 \u00a0 Product A<\/pre>\n<p><span style=\"font-weight: 400;\">We repeat this process for the <\/span><strong><a href=\"https:\/\/docs.google.com\/document\/d\/1wQJdop9N-po3G4v5dKoSWjbBG4qJEARaZhzSyrS-qGU\/edit#heading=h.lrre1t1mw93s\">Products<\/a><\/strong><span style=\"font-weight: 400;\"> and <\/span><strong><a href=\"https:\/\/docs.google.com\/document\/d\/1wQJdop9N-po3G4v5dKoSWjbBG4qJEARaZhzSyrS-qGU\/edit#heading=h.r8fwr2f4lkn0\">Parts<\/a><\/strong><span style=\"font-weight: 400;\"> files, altering the <\/span><i><span style=\"font-weight: 400;\">filepath_or_buffer<\/span><\/i><span style=\"font-weight: 400;\"> and <\/span><i><span style=\"font-weight: 400;\">nrows<\/span><\/i><span style=\"font-weight: 400;\"> parameters to reflect the respective file\u2019s location and table size.<\/span><\/p>\n<h2>Tabular to RDF<\/h2>\n<p><span style=\"font-weight: 400;\">Now that we have our tabular data stored in DataFrame variables, we are going to use <\/span><a href=\"https:\/\/rdflib.readthedocs.io\/en\/stable\/\"><span style=\"font-weight: 400;\"><strong>rdflib<\/strong><\/span><\/a><span style=\"font-weight: 400;\"> to create subject-predicate-object triples for each column\/row entry in the three DataFrames. I would recommend reading Quinn\u2019s blog prior to this one as I am following the methods and conventions that he explains in his post.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Utilizing the <\/span><i><span style=\"font-weight: 400;\">Namespace<\/span><\/i><span style=\"font-weight: 400;\"> module will provide us a shorthand for creating URIs, and the <\/span><i><span style=\"font-weight: 400;\">create_eg_uri <\/span><\/i><span style=\"font-weight: 400;\">method will url-encode our data values.<\/span><\/p>\n<pre>from rdflib import Namespace\nfrom urllib.parse import quote\n\nEG = Namespace(\"<a href=\"http:\/\/example.com\/\">http:\/\/example.com\/<\/a>\")\n\ndef create_eg_uri(name: str) -&gt; URIRef:\n   \u00a0\"\"\"Take a string and return a valid example.com URI\"\"\"\n\u00a0\u00a0\u00a0\u00a0quoted = quote(name.replace(\" \", \"_\"))\n\u00a0\u00a0\u00a0\u00a0return EG[quoted]<\/pre>\n<p><span style=\"font-weight: 400;\">The <\/span><i><span style=\"font-weight: 400;\">columns<\/span><\/i><span style=\"font-weight: 400;\"> in our data tables will need to be mapped to <\/span><i><span style=\"font-weight: 400;\">predicates<\/span><\/i><span style=\"font-weight: 400;\"> in our graph. For example, the<\/span><i><span style=\"font-weight: 400;\"> Owns Product<\/span><\/i><span style=\"font-weight: 400;\"> column in the <\/span><strong><a href=\"https:\/\/docs.google.com\/document\/d\/1wQJdop9N-po3G4v5dKoSWjbBG4qJEARaZhzSyrS-qGU\/edit#heading=h.qxx8u7xjfvin\">Customers<\/a><\/strong><span style=\"font-weight: 400;\"> table will map to the <\/span><strong><a href=\"http:\/\/example.com\/owns\"><i>http:\/\/example.com\/owns<\/i><\/a><\/strong><span style=\"font-weight: 400;\"> predicate in our graph. We must define the column to predicate mappings for each of our tables before diving into the DataFrame transformations. Additionally, each mapping object contains a <\/span><i><span style=\"font-weight: 400;\">\u201curi\u201d<\/span><\/i><span style=\"font-weight: 400;\"> field which indicates the column to use when creating the unique identifier for an object.<\/span><\/p>\n<pre>customer_mapping = {\n\u00a0\u00a0\u00a0\u00a0\"uri\": \"Customer Name\",\n\u00a0 \u00a0 \"Customer ID\": create_eg_uri(\"customerId\"),\n \u00a0 \u00a0\"Customer Name\": create_eg_uri(\"customerName\"),\n \u00a0 \u00a0\"Owns Product\": create_eg_uri(\"owns\"),\n}\n\nproduct_mapping = {\n\n\u00a0\u00a0\u00a0\u00a0\"uri\": \"Product Name\",\n\u00a0 \u00a0 \"Product ID\": create_eg_uri(\"productId\"),\n\u00a0 \u00a0 \"Product Name\": create_eg_uri(\"productName\"),\n \u00a0 \u00a0\"Composed of\": create_eg_uri(\"isComposedOf\"),\n}\n\npart_mapping = {\n\n\u00a0\u00a0\u00a0\u00a0\"uri\": \"Part Name\",\n \u00a0 \u00a0\"Part ID\": create_eg_uri(\"partId\"),\n \u00a0 \u00a0\"Part Name\": create_eg_uri(\"partName\"),\n\u00a0 \u00a0 \"Action\": create_eg_uri(\"needs\"),\n}\n\nuri_objects = [\"Owns Product\", \"Composed of\", \"Action\"]\n<\/pre>\n<p>The <em>uri_objects<\/em> variable created above indicates which columns from the three data tables should have their values parsed as <em><a href=\"https:\/\/rdflib.readthedocs.io\/en\/stable\/rdf_terms.html#urirefs\">URI References<\/a><\/em>, rather than <em><a href=\"https:\/\/rdflib.readthedocs.io\/en\/stable\/rdf_terms.html#literals\">Literals<\/a><\/em>. For example, <em>Composed of<\/em> maps to a <em>Part<\/em> object. We want to make the <em>&lt;Part&gt;<\/em> object in the triple <code>EG:Product_A EG:isComposedOf &lt;Part&gt;<\/code> a URI pointing to\/referencing a particular <em>Part<\/em>, not just the string name of the <em>Part<\/em>. Whereas the <em>Product Name<\/em> column creates triples such as <code>EG:Product_A EG:productName \u201cname\u201d<\/code>\u00a0and \u201cname\u201d is simply a string, i.e. a <em>Literal<\/em>, and not a reference to another object.<\/p>\n<p><span style=\"font-weight: 400;\">Now, using all of the variables and methods declared above, we can begin the translation from DataFrame to RDF. For the purposes of this example, we create a global <\/span><i><span style=\"font-weight: 400;\">graph <\/span><\/i><span style=\"font-weight: 400;\">variable and a reusable <\/span><i><span style=\"font-weight: 400;\">translate_df_to_rdf <\/span><\/i><span style=\"font-weight: 400;\">function which we will call for each of the three DataFrames. With each call to the translate function, all triples for that particular table are added to the graph.<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">from<\/span><span style=\"font-weight: 400;\"> rdflib <\/span><span style=\"font-weight: 400;\">import<\/span><span style=\"font-weight: 400;\"> URIRef, Graph, Literal<\/span>\n<span style=\"font-weight: 400;\">import<\/span><span style=\"font-weight: 400;\"> pandas <\/span><span style=\"font-weight: 400;\">as<\/span><span style=\"font-weight: 400;\"> pd<\/span>\n\n<span style=\"font-weight: 400;\">graph = Graph()<\/span>\n\n<span style=\"font-weight: 400;\">def<\/span><span style=\"font-weight: 400;\"> translate_df_to_rdf(customer_data, customer_mapping):<\/span>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><i><span style=\"font-weight: 400;\"># Counter variable representing current row in the table<\/span><\/i>\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0i = <\/span><span style=\"font-weight: 400;\">0<\/span>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 num_rows = len(customer_data.index)<\/span>\n\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><i><span style=\"font-weight: 400;\"># For each row in the table<\/span><\/i>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">while<\/span><span style=\"font-weight: 400;\"> i &lt; num_rows:<\/span>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><i><span style=\"font-weight: 400;\"># Create URI subject for triples in this row using \u2018Name\u2019 column<\/span><\/i>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 name = customer_data.loc[i, customer_mapping[<\/span><span style=\"font-weight: 400;\">\"uri\"<\/span><span style=\"font-weight: 400;\">]]<\/span>\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0row_uri = create_eg_uri(name)<\/span>\n\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><i><span style=\"font-weight: 400;\"># For each column\/predicate mapping in mapping dictionary<\/span><\/i>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">for<\/span><span style=\"font-weight: 400;\"> column_name, predicate<\/span><span style=\"font-weight: 400;\"> in<\/span><span style=\"font-weight: 400;\"> customer_mapping.items():<\/span>\n\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\"># Grab the value at this specific row\/column entry<\/span><\/i>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 value = customer_data.loc[i, column_name]<\/span>\n\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><i><span style=\"font-weight: 400;\"># Strip extra characters from value<\/span><\/i>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">if<\/span><span style=\"font-weight: 400;\"> isinstance(value, str):<\/span>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 value = value.strip()<\/span>\n\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><i><span style=\"font-weight: 400;\"># Check if the value exists<\/span><\/i>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">if not<\/span><span style=\"font-weight: 400;\"> pd.isnull((value)):<\/span>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><i><span style=\"font-weight: 400;\"># Determine if object should be a URI or Literal<\/span><\/i>\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">if<\/span><span style=\"font-weight: 400;\"> column_name <\/span><span style=\"font-weight: 400;\">in <\/span><span style=\"font-weight: 400;\">uri_objects:<\/span>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><i><span style=\"font-weight: 400;\"># Create URI object and add triple to graph<\/span><\/i>\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uri_value = create_eg_uri(value)<\/span>\n<span style=\"font-weight: 400;\">  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 graph.add((row_uri, predicate, uri_value))<\/span>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">else<\/span><span style=\"font-weight: 400;\">:<\/span>\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\"># Create Literal object and add triple to graph<\/span><\/i>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 graph.add((row_uri, predicate, Literal(value)))<\/span>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 i = i +\u00a0<\/span><span style=\"font-weight: 400;\">1\n<\/span><\/pre>\n<h2>Querying the Graph<\/h2>\n<p>In this case, we make three calls to <em>translate_df_to_rdf<\/em>:<\/p>\n<pre>translate_df_to_rdf(customer_data, customer_mapping)\ntranslate_df_to_rdf(product_data, product_mapping)\ntranslate_df_to_rdf(part_data, part_mapping)<\/pre>\n<p><span style=\"font-weight: 400;\">Now that our graph is populated with the Customers, Products, and Parts data, we can query it for personalized content of our choosing. So, if we want to find all customers who own products that are composed of parts that need a recall, we can create and use the same query from Quinn\u2019s previous blog:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">sparql_query = <\/span><span style=\"font-weight: 400;\">\"\"\"SELECT ?customer ?product<\/span>\n<span style=\"font-weight: 400;\">WHERE {<\/span>\n<span style=\"font-weight: 400;\">\u00a0 ?customer eg:owns ?product .<\/span>\n<span style=\"font-weight: 400;\">\u00a0 ?product eg:isComposedOf ?part .<\/span>\n<span style=\"font-weight: 400;\">\u00a0 ?part eg:needs eg:Recall .<\/span>\n<span style=\"font-weight: 400;\">}\"\"\"<\/span>\n\n<span style=\"font-weight: 400;\">results = graph.query(sparql_query, initNs={<\/span><span style=\"font-weight: 400;\">\"eg\"<\/span><span style=\"font-weight: 400;\">: EG})<\/span>\n<span style=\"font-weight: 400;\">for<\/span><span style=\"font-weight: 400;\"> row <\/span><span style=\"font-weight: 400;\">in<\/span><span style=\"font-weight: 400;\"> results:<\/span>\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 print(row)<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">As you would expect, the results printed in the console are two <\/span><i><span style=\"font-weight: 400;\">?customer ?product<\/span><\/i><span style=\"font-weight: 400;\"> pairings:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">(rdflib.term.URIRef(<\/span><span style=\"font-weight: 400;\">'http:\/\/example.com\/Stephen_Smith'<\/span><span style=\"font-weight: 400;\">), rdflib.term.URIRef(<\/span><span style=\"font-weight: 400;\">'http:\/\/example.com\/Product_A'<\/span><span style=\"font-weight: 400;\">))<\/span>\n<span style=\"font-weight: 400;\">(rdflib.term.URIRef(<\/span><span style=\"font-weight: 400;\">'http:\/\/example.com\/Lisa_Lu'<\/span><span style=\"font-weight: 400;\">), rdflib.term.URIRef(<\/span><span style=\"font-weight: 400;\">'http:\/\/example.com\/Product_A'<\/span><span style=\"font-weight: 400;\">))<\/span><\/pre>\n<h2>Summary<\/h2>\n<p><span style=\"font-weight: 400;\">By transforming our CSV files into RDF triples, we created a centralized, connected graph of information, enabling the simple retrieval of very granular and case-specific data. In this case, we simply traversed the relationships in our graph between <\/span><i><span style=\"font-weight: 400;\">Customers<\/span><\/i><span style=\"font-weight: 400;\">, <\/span><i><span style=\"font-weight: 400;\">Products<\/span><\/i><span style=\"font-weight: 400;\">, <\/span><i><span style=\"font-weight: 400;\">Parts<\/span><\/i><span style=\"font-weight: 400;\">, and <\/span><i><span style=\"font-weight: 400;\">Actions<\/span><\/i><span style=\"font-weight: 400;\"> to determine which Customers needed to be notified of a recall. In practice, these concepts can be expanded to meet any personalization needs for your organization.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Knowledge Graphs are an integral part of serving up targeted, useful information via a Componentized Content Management System, and your organization doesn\u2019t need to start from scratch. CSVs and tabular data can easily be transformed into RDF and aggregated as the foundation for your organization\u2019s Knowledge Graph. If you are interested in transforming your data into RDF and want help planning or implementing a transformation effort, contact us <\/span><a href=\"https:\/\/enterprise-knowledge.com\/contact-us\/\"><span style=\"font-weight: 400;\"><strong>here<\/strong><\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>My colleagues Joe Hilger and Neil Quinn recently wrote blogs highlighting the benefits of leveraging a knowledge graph in tandem with a componentized content management system (CCMS) to curate personalized content for users. Hilger set the stage explaining the business value of a personalized digital experience and the logistics of these two technologies supporting one &#8230; <a href=\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/\"  class=\"with-arrow\">Continue reading<\/a><\/p>\n","protected":false},"author":65,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"_uag_custom_page_level_css":"","footnotes":""},"categories":[187,512,186],"tags":[1062,1064,1063,428,427,714,678],"article-type":[100],"solution":[1092],"ppma_author":[1405],"class_list":["post-14576","post","type-post","status-publish","format-standard","hentry","category-advanced-content","category-knowledge-graphs-data-modeling","category-software-development","tag-ccms","tag-componentized-content-management-system","tag-content-personalization","tag-enterprise-knowledge-graph","tag-knowledge-graph","tag-rdf","tag-sparql","article-type-blog","solution-enterprise-ai"],"acf":[],"featured_image_urls_v2":{"full":"","thumbnail":"","medium":"","medium_large":"","large":"","1536x1536":"","2048x2048":"","slideshow":"","slideshow-2x":"","banner":"","home-large":"","home-medium":"","home-small":"","gform-image-choice-sm":"","gform-image-choice-md":"","gform-image-choice-lg":""},"post_excerpt_stackable_v2":"<p>My colleagues Joe Hilger and Neil Quinn recently wrote blogs highlighting the benefits of leveraging a knowledge graph in tandem with a componentized content management system (CCMS) to curate personalized content for users. Hilger set the stage explaining the business value of a personalized digital experience and the logistics of these two technologies supporting one &#8230;<\/p>\n","category_list_v2":"<a href=\"https:\/\/enterprise-knowledge.com\/category\/advanced-content\/\" rel=\"category tag\">Content Strategy and Operations<\/a>, <a href=\"https:\/\/enterprise-knowledge.com\/category\/knowledge-graphs-data-modeling\/\" rel=\"category tag\">Knowledge Graphs &amp; Data Modeling<\/a>, <a href=\"https:\/\/enterprise-knowledge.com\/category\/software-development\/\" rel=\"category tag\">Technology Solutions<\/a>","author_info_v2":{"name":"Kate Erfle","url":"https:\/\/enterprise-knowledge.com\/author\/kerfle\/"},"comments_num_v2":"0 comments","yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Transforming Tabular Data into Personalized, Componentized Content using Knowledge Graphs in Python - Enterprise Knowledge<\/title>\n<meta name=\"description\" content=\"How to create a knowledge graph using Python and CSV files to provide personalized content for your customers.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Transforming Tabular Data into Personalized, Componentized Content using Knowledge Graphs in Python - Enterprise Knowledge\" \/>\n<meta property=\"og:description\" content=\"How to create a knowledge graph using Python and CSV files to provide personalized content for your customers.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Enterprise Knowledge\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Enterprise-Knowledge-359618484181651\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-22T13:30:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-03T18:02:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png\" \/>\n<meta name=\"author\" content=\"Kate Erfle\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@EKConsulting\" \/>\n<meta name=\"twitter:site\" content=\"@EKConsulting\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kate Erfle\" \/>\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\":\"Article\",\"@id\":\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/\"},\"author\":{\"name\":\"Kate Erfle\",\"@id\":\"https:\/\/enterprise-knowledge.com\/#\/schema\/person\/446c31c81774f2110ca8ca58fb2b230c\"},\"headline\":\"Transforming Tabular Data into Personalized, Componentized Content using Knowledge Graphs in Python\",\"datePublished\":\"2022-03-22T13:30:26+00:00\",\"dateModified\":\"2025-09-03T18:02:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/\"},\"wordCount\":1094,\"publisher\":{\"@id\":\"https:\/\/enterprise-knowledge.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png\",\"keywords\":[\"CCMS\",\"Componentized Content Management System\",\"Content Personalization\",\"enterprise knowledge graph\",\"knowledge graph\",\"RDF\",\"SPARQL\"],\"articleSection\":[\"Content Strategy and Operations\",\"Knowledge Graphs &amp; Data Modeling\",\"Technology Solutions\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/\",\"url\":\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/\",\"name\":\"Transforming Tabular Data into Personalized, Componentized Content using Knowledge Graphs in Python - Enterprise Knowledge\",\"isPartOf\":{\"@id\":\"https:\/\/enterprise-knowledge.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png\",\"datePublished\":\"2022-03-22T13:30:26+00:00\",\"dateModified\":\"2025-09-03T18:02:59+00:00\",\"description\":\"How to create a knowledge graph using Python and CSV files to provide personalized content for your customers.\",\"breadcrumb\":{\"@id\":\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#primaryimage\",\"url\":\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png\",\"contentUrl\":\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png\",\"width\":1248,\"height\":588,\"caption\":\"Diagram showing customers, products and parts\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/enterprise-knowledge.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Transforming Tabular Data into Personalized, Componentized Content using Knowledge Graphs in Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/enterprise-knowledge.com\/#website\",\"url\":\"https:\/\/enterprise-knowledge.com\/\",\"name\":\"Enterprise Knowledge\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/enterprise-knowledge.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/enterprise-knowledge.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/enterprise-knowledge.com\/#organization\",\"name\":\"Enterprise Knowledge\",\"url\":\"https:\/\/enterprise-knowledge.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/enterprise-knowledge.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2013\/09\/favicon.jpg\",\"contentUrl\":\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2013\/09\/favicon.jpg\",\"width\":69,\"height\":69,\"caption\":\"Enterprise Knowledge\"},\"image\":{\"@id\":\"https:\/\/enterprise-knowledge.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Enterprise-Knowledge-359618484181651\/\",\"https:\/\/x.com\/EKConsulting\",\"https:\/\/www.linkedin.com\/company\/enterprise-knowledge-llc\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/enterprise-knowledge.com\/#\/schema\/person\/446c31c81774f2110ca8ca58fb2b230c\",\"name\":\"Kate Erfle\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/enterprise-knowledge.com\/#\/schema\/person\/image\/15adc4d2be7b37ed22ae57ecc6f6f0c9\",\"url\":\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2025\/05\/KateErfle-96x96.jpg\",\"contentUrl\":\"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2025\/05\/KateErfle-96x96.jpg\",\"caption\":\"Kate Erfle\"},\"description\":\"Kate Erfle is a software developer currently focused on back-end development in Python and frontend development in React. She is experienced in creating Java applications and using PHP, HTML, Javascript, and CSS for web development. Kate is passionate about delivering quality products to her clients. She sets ambitious goals and strategically and systematically works to achieve them. Her organization, self-awareness, and diligence are assets in any collaborative project environment.\",\"url\":\"https:\/\/enterprise-knowledge.com\/author\/kerfle\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Transforming Tabular Data into Personalized, Componentized Content using Knowledge Graphs in Python - Enterprise Knowledge","description":"How to create a knowledge graph using Python and CSV files to provide personalized content for your customers.","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:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/","og_locale":"en_US","og_type":"article","og_title":"Transforming Tabular Data into Personalized, Componentized Content using Knowledge Graphs in Python - Enterprise Knowledge","og_description":"How to create a knowledge graph using Python and CSV files to provide personalized content for your customers.","og_url":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/","og_site_name":"Enterprise Knowledge","article_publisher":"https:\/\/www.facebook.com\/Enterprise-Knowledge-359618484181651\/","article_published_time":"2022-03-22T13:30:26+00:00","article_modified_time":"2025-09-03T18:02:59+00:00","og_image":[{"url":"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png","type":"","width":"","height":""}],"author":"Kate Erfle","twitter_card":"summary_large_image","twitter_creator":"@EKConsulting","twitter_site":"@EKConsulting","twitter_misc":{"Written by":"Kate Erfle","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#article","isPartOf":{"@id":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/"},"author":{"name":"Kate Erfle","@id":"https:\/\/enterprise-knowledge.com\/#\/schema\/person\/446c31c81774f2110ca8ca58fb2b230c"},"headline":"Transforming Tabular Data into Personalized, Componentized Content using Knowledge Graphs in Python","datePublished":"2022-03-22T13:30:26+00:00","dateModified":"2025-09-03T18:02:59+00:00","mainEntityOfPage":{"@id":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/"},"wordCount":1094,"publisher":{"@id":"https:\/\/enterprise-knowledge.com\/#organization"},"image":{"@id":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#primaryimage"},"thumbnailUrl":"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png","keywords":["CCMS","Componentized Content Management System","Content Personalization","enterprise knowledge graph","knowledge graph","RDF","SPARQL"],"articleSection":["Content Strategy and Operations","Knowledge Graphs &amp; Data Modeling","Technology Solutions"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/","url":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/","name":"Transforming Tabular Data into Personalized, Componentized Content using Knowledge Graphs in Python - Enterprise Knowledge","isPartOf":{"@id":"https:\/\/enterprise-knowledge.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#primaryimage"},"image":{"@id":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#primaryimage"},"thumbnailUrl":"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png","datePublished":"2022-03-22T13:30:26+00:00","dateModified":"2025-09-03T18:02:59+00:00","description":"How to create a knowledge graph using Python and CSV files to provide personalized content for your customers.","breadcrumb":{"@id":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#primaryimage","url":"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png","contentUrl":"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2022\/02\/EK-content-personalization-blog-2.png","width":1248,"height":588,"caption":"Diagram showing customers, products and parts"},{"@type":"BreadcrumbList","@id":"https:\/\/enterprise-knowledge.com\/transforming-tabular-data-into-personalized-componentized-content-using-knowledge-graphs-in-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/enterprise-knowledge.com\/"},{"@type":"ListItem","position":2,"name":"Transforming Tabular Data into Personalized, Componentized Content using Knowledge Graphs in Python"}]},{"@type":"WebSite","@id":"https:\/\/enterprise-knowledge.com\/#website","url":"https:\/\/enterprise-knowledge.com\/","name":"Enterprise Knowledge","description":"","publisher":{"@id":"https:\/\/enterprise-knowledge.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/enterprise-knowledge.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/enterprise-knowledge.com\/#organization","name":"Enterprise Knowledge","url":"https:\/\/enterprise-knowledge.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/enterprise-knowledge.com\/#\/schema\/logo\/image\/","url":"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2013\/09\/favicon.jpg","contentUrl":"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2013\/09\/favicon.jpg","width":69,"height":69,"caption":"Enterprise Knowledge"},"image":{"@id":"https:\/\/enterprise-knowledge.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Enterprise-Knowledge-359618484181651\/","https:\/\/x.com\/EKConsulting","https:\/\/www.linkedin.com\/company\/enterprise-knowledge-llc"]},{"@type":"Person","@id":"https:\/\/enterprise-knowledge.com\/#\/schema\/person\/446c31c81774f2110ca8ca58fb2b230c","name":"Kate Erfle","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/enterprise-knowledge.com\/#\/schema\/person\/image\/15adc4d2be7b37ed22ae57ecc6f6f0c9","url":"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2025\/05\/KateErfle-96x96.jpg","contentUrl":"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2025\/05\/KateErfle-96x96.jpg","caption":"Kate Erfle"},"description":"Kate Erfle is a software developer currently focused on back-end development in Python and frontend development in React. She is experienced in creating Java applications and using PHP, HTML, Javascript, and CSS for web development. Kate is passionate about delivering quality products to her clients. She sets ambitious goals and strategically and systematically works to achieve them. Her organization, self-awareness, and diligence are assets in any collaborative project environment.","url":"https:\/\/enterprise-knowledge.com\/author\/kerfle\/"}]}},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"slideshow":false,"slideshow-2x":false,"banner":false,"home-large":false,"home-medium":false,"home-small":false,"gform-image-choice-sm":false,"gform-image-choice-md":false,"gform-image-choice-lg":false},"uagb_author_info":{"display_name":"Kate Erfle","author_link":"https:\/\/enterprise-knowledge.com\/author\/kerfle\/"},"uagb_comment_info":0,"uagb_excerpt":"My colleagues Joe Hilger and Neil Quinn recently wrote blogs highlighting the benefits of leveraging a knowledge graph in tandem with a componentized content management system (CCMS) to curate personalized content for users. Hilger set the stage explaining the business value of a personalized digital experience and the logistics of these two technologies supporting one&hellip;","authors":[{"term_id":1405,"user_id":65,"is_guest":0,"slug":"kerfle","display_name":"Kate Erfle","avatar_url":"https:\/\/enterprise-knowledge.com\/wp-content\/uploads\/2025\/05\/KateErfle-96x96.jpg","first_name":"Kate","last_name":"Erfle","user_url":"","job_title":"","description":"Kate Erfle is a software developer currently focused on back-end development in Python and frontend development in React. She is experienced in creating Java applications and using PHP, HTML, Javascript, and CSS for web development. Kate is passionate about delivering quality products to her clients. She sets ambitious goals and strategically and systematically works to achieve them. Her organization, self-awareness, and diligence are assets in any collaborative project environment."}],"_links":{"self":[{"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/posts\/14576","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/users\/65"}],"replies":[{"embeddable":true,"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/comments?post=14576"}],"version-history":[{"count":28,"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/posts\/14576\/revisions"}],"predecessor-version":[{"id":25398,"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/posts\/14576\/revisions\/25398"}],"wp:attachment":[{"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/media?parent=14576"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/categories?post=14576"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/tags?post=14576"},{"taxonomy":"article-type","embeddable":true,"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/article-type?post=14576"},{"taxonomy":"solution","embeddable":true,"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/solution?post=14576"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/enterprise-knowledge.com\/wp-json\/wp\/v2\/ppma_author?post=14576"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}