<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Blog posts by Manh Nguyen</title><link href="http://world.optimizely.com" /><updated>2024-09-12T07:14:32.0000000Z</updated><id>https://world.optimizely.com/blogs/manh-nguyen/</id> <generator uri="http://world.optimizely.com" version="2.0">Optimizely World</generator> <entry><title>Introduce the ablility to select then delete items manually on FIND UI</title><link href="https://world.optimizely.com/blogs/manh-nguyen/dates/2024/9/introduce-the-ablility-to-select-then-delete-items-manually-on-find-ui/" /><id>&lt;p&gt;In FIND 16.3.0 we introduce an ability to select items and delete them manually, it will helps you to delete unexpected items from the UI without any line of code.&lt;/p&gt;
&lt;p&gt;To do so, go to menu Search &amp;amp; Navigation &amp;gt; Indexed Content &amp;gt; Explore tab then you could see the column next to Type column on the right. Just select the items you want to delete then click [x] button. A confirmation dialog appears with the warning message that the deleting action could not be undone. Hit &quot;Delete&quot; button on the dialog to delete your selected content.&lt;/p&gt;
&lt;p&gt;See our &lt;a href=&quot;https://support.optimizely.com/hc/en-us/articles/23973547163917-2024-Search-Navigation-release-notes&quot;&gt;Release notes&lt;/a&gt; and check it out.&lt;img src=&quot;/link/e3c13444947442e5a9de27414567628a.aspx&quot; alt=&quot;Image image.png&quot; /&gt;&lt;/p&gt;</id><updated>2024-09-12T07:14:32.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Introducing Search &amp; Navigation Import/Export functionality</title><link href="https://world.optimizely.com/blogs/manh-nguyen/dates/2024/7/introducing-search--navigation-importexport-functionality-for-statistics/" /><id>&lt;p&gt;We introduce a small but helpful funcionality for customers which allow customers import/export list of &lt;em&gt;&lt;strong&gt;Related Queries&lt;/strong&gt;&lt;/em&gt;, &lt;em&gt;&lt;strong&gt;Synonyms&lt;/strong&gt;&lt;/em&gt;, &lt;em&gt;&lt;strong&gt;Autocomplete &lt;/strong&gt;&lt;/em&gt;and &lt;em&gt;&lt;strong&gt;Connectors &lt;/strong&gt;&lt;/em&gt;list on FIND 16.3.0.&lt;/p&gt;
&lt;p&gt;This will let you manage your list easier, update them quicker or even save the list as a backup file.&lt;/p&gt;
&lt;p&gt;Click &quot;Show Help&quot; on the top-right to see the required importing columns or click &quot;Export ...&quot; to get the template.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Export functionality&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/link/29d923da1d3543d08b4c0aca0b7f7690.aspx&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you click &quot;Export ...&quot;, an .csv file will be downloaded with name = functionality name + timestamp that contains all required and optional columns.&lt;/p&gt;
&lt;p&gt;For better performance, we support a maximum of 1000 items on a file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Import functionality&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Please note that to avoid unexpected update the current data we only support adding new data to store in our service, if you want to update an item you should do it manually. The items do not exist in the store but exist in the csv file will be added as new items.&lt;/p&gt;
&lt;p&gt;Before importing your list items, few conditions need to be met:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accept .csv file only for importing items.&lt;/li&gt;
&lt;li&gt;All required columns should be filled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Otherwise, it will show the error: &quot;A .csv file containing ... is required&quot;. See below image:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/link/dd0c014a7d884aa580901dbb36b35135.aspx&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All required columns must be fully filled. An &quot;Incorrect data format&quot; will be raised if any required column is absent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/link/bdf54e4618f74619a3a092a2e8040c21.aspx&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Click &quot;Import ...&quot; then select your file -&amp;gt; Confirm that you select correct file and want to import -&amp;gt; FIND client will import your list items to our service after your confirmation.&lt;/p&gt;
&lt;p&gt;A success message will be displayed when your file meets all conditions.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/link/b9419035c53243a78ae476b17b68fd18.aspx&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Please contact us if you have any feedback or questions.&lt;/p&gt;</id><updated>2024-09-11T03:02:30.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Default caching on search request on Search &amp; Navigation</title><link href="https://world.optimizely.com/blogs/manh-nguyen/dates/2024/9/default-caching-on-search-request/" /><id>&lt;p&gt;For the better performance, Search &amp;amp; Navigation .Net client has provided &lt;em&gt;StaticallyCacheFor&lt;/em&gt; method for caching your search result in a specific of time span. It really useful when you perform a real-time search response to your users without a request.&lt;/p&gt;
&lt;p&gt;We now including a default caching duration for your search request in-case &lt;em&gt;StaticallyCacheFor&lt;/em&gt; make your code more cumbersome &#128515;&lt;/p&gt;
&lt;p&gt;This can be done by setting &lt;em&gt;&lt;strong&gt;DefaultSearchCacheDuration&lt;/strong&gt;&lt;/em&gt; (in seconds) in Find section and it applies to all request that calling to &lt;em&gt;GetResult&lt;/em&gt; or &lt;em&gt;GetContentResult&lt;/em&gt; (in both asynchronous and synchronous version of API).&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt;    &quot;Find&quot;: {
      &quot;DefaultIndex&quot;: &quot;your_index&quot;,
      &quot;ServiceUrl&quot;: &quot;https://service.find.episerver.net/your_private_key&quot;,
      &quot;DefaultSearchCacheDuration&quot;: 300
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the example above you config for default caching in 5 minutes, but you can overide this default value for some specific request by using &lt;em&gt;StaticallyCacheFor&lt;/em&gt;, this will replace default value as highest priority.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;//this response will cache the search result by 5 minutes as DefaultSearchCacheDuration is set to 300 seconds.
var responseCacheInDefault = await SearchClient.Instance
.Search&amp;lt;IContent&amp;gt;().For(&quot;samsung&quot;)
.GetResultAsync();

//but this response will be cached in 15 minutes
var responseCacheOverridden = await SearchClient.Instance
.Search&amp;lt;IContent&amp;gt;().For(&quot;iphone&quot;)
.StaticallyCacheFor(TimeSpan.FromMinutes(15))
.GetResultAsync();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you don&#39;t have &lt;em&gt;DefaultSearchCacheDuration&lt;/em&gt; in the Find config and don&#39;t also set &lt;em&gt;StaticallyCacheFor&lt;/em&gt;, your search response will automatically cache in 10 minutes.&lt;/p&gt;
&lt;p&gt;But maybe you ask for &quot;what if I don&#39;t need any default search cache?&quot;, just set &lt;em&gt;DefaultSearchCacheDuration&lt;/em&gt; to zero.&lt;/p&gt;
&lt;p&gt;For more details please go to our &lt;a href=&quot;https://docs.developers.optimizely.com/digital-experience-platform/v1.1.0-search-and-navigation/docs/caching&quot;&gt;documents for developers.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please don&#39;t hesitate to contact us if you have any question or feedback.&lt;/p&gt;</id><updated>2024-09-04T03:32:19.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Non-blocking Search with Optimizely Search &amp; Navigation</title><link href="https://world.optimizely.com/blogs/manh-nguyen/dates/2024/7/asynchronous-search-with-optimizely/" /><id>&lt;p&gt;We are thrilled to announce the integration of asynchronous functions into Optimizely&amp;rsquo;s Search &amp;amp; Navigation features, which have been supported since version 16.3.0. &lt;span&gt;By using these functions, you can leverage the benefits of asynchronous programming and performance improvements. They are particularly helpful if you are building your app with a microservices architecture or simultaneous searching for better user experiences.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The current synchronous functions such as search features, tracking, indexing...can be marked as deprecate in the future.&lt;/p&gt;
&lt;p&gt;We&#39;ve already known the advantages of Asynchronous programming:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Performance:&lt;/strong&gt; Asynchronous operations enable non-blocking processes, reducing wait times and improving overall system responsiveness.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability:&lt;/strong&gt; Handle multiple requests simultaneously, ensuring consistent performance even during peak usage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User Experience:&lt;/strong&gt; Faster response times lead to a smoother, more dynamic user experience.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;How we leverage these advantages in Search &amp;amp; Navigation?&lt;/p&gt;
&lt;p&gt;Imagine an user searching for a product on your e-commerce site. With asynchronous search, the request is processed instantly. Simultaneously, tracking and statistics operations run in the background, updating user interactions in real-time without impacting the search performance. Paging through results remains smooth and quick, giving users a better experience.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;var results = await SearchClient.Instance
.UnifiedSearch()
.For(&quot;search navigation&quot;)
.WithAndAsDefaultOperator()
.UsingAutoBoost()
.ApplyBestBets()
.Track() // statistical track will run asynchnorously and not affect to the search request
.GetResultAsync();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By integrating asynchronous functions, Optimizely Search &amp;amp; Navigation ensures your platform is future-proof, delivering better performance and a better user experience. Upgrade today to experience the difference!&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://docs.developers.optimizely.com/digital-experience-platform/v1.1.0-search-and-navigation/docs/net-client-async-apis&quot;&gt;developer&#39;s document&lt;/a&gt; for more detail and please don&#39;t hesitate contact us if you have any question or feedback.&lt;/p&gt;</id><updated>2024-09-04T02:54:13.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Configure your own Search &amp; Navigation timeouts</title><link href="https://world.optimizely.com/blogs/manh-nguyen/dates/2024/8/configure-your-own-search--navigation-timeouts/" /><id>&lt;p&gt;The main blog &lt;a href=&quot;/link/2ebb1de776364df5b6d717d70c3a17e7.aspx&quot;&gt;Configure your own Search &amp;amp; Navigation timeouts&lt;/a&gt; was posted for years but you need copy the code to your application.&lt;/p&gt;
&lt;p&gt;We now bring those code to FIND 16.3.0 and you just need to call SetTimeout(&lt;em&gt;/*timeout in milliseconds*&lt;/em&gt;/) method fo make your request works. Both Search and MultiSearch request will work with SetTimeout from FIND 16.3.0.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;var searchResults = SearchClient.Instance.Search&amp;lt;IContent&amp;gt;().For(&quot;alloy&quot;).SetTimeout(10000).GetContentResult();

var multiSearchResults = SearchClient.Instance..MultiSearch&amp;lt;IContent&amp;gt;()
                        .Search&amp;lt;IContent&amp;gt;(x =&amp;gt; x.For(&quot;test1&quot;).InField(f =&amp;gt; f.Name))
                        .Search&amp;lt;IContent&amp;gt;(x =&amp;gt; x.For(&quot;test2&quot;).InField(f =&amp;gt; f.Name))
                        .SetTimeout(10000) 
                        .GetContentResult());&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Please contact us if you have any question or feedback.&lt;/p&gt;</id><updated>2024-08-30T03:23:30.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Tool tips: Optimizely Graph Client Tool and how to leverage CMS data models to build query</title><link href="https://world.optimizely.com/blogs/manh-nguyen/dates/2024/4/optimizely-graph-client-dealing-with-cms-data-models-for-query-builder/" /><id>&lt;p&gt;&lt;span&gt;Read my first blog about &lt;a href=&quot;/link/7143976e5b8744aabbb9ef52647e747c.aspx&quot;&gt;Optimizely Graph Client introduction&lt;/a&gt; to know its advantages.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Beside Optimizely Graph Client, now we&#39;re supporting a tool for &lt;a href=&quot;https://github.com/episerver/graph-net-sdk?tab=readme-ov-file#install-optimizely-graph-client-tool&quot;&gt;generating the schema models into C# model classes&lt;/a&gt;. This tool supports for precisely generating models which had indexed to the Optimizely Graph, particularly after Content Delivery has transformed CMS models. You can install then use this simple tool with just a few commands and it&#39;s very helpful for query builder and/or deserializing search response.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Notably, with headless architecture, certain properties within the Graph schema and CMS models may differ in name or type, as outlined in our &lt;a href=&quot;https://docs.developers.optimizely.com/content-management-system/v1.5.0-content-delivery-api/docs/serialization&quot;&gt;Content Delivery&lt;/a&gt; documentation; additionally, our indexing process introduces new properties into the Optimizely Graph&#39;s schema models. I suppose that you want to build queries with only existing CMS models (or perhaps your custom models) without relying on the generation tool. We&#39;ve got you covered with a nifty tip for you.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Using extension methods&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;One of the most elegant solutions at your disposal is leveraging extension methods. By creating methods with name and return type same as needed properties in the query builder, you could use the methods as the fields for your object model. With just a few lines of code, you can seamlessly integrate extension methods into your CMS models, enhancing their functionality and flexibility.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Consider an example from the Alloy site, where we add &lt;em&gt;Url&lt;/em&gt;, &lt;em&gt;ContentType&lt;/em&gt;&amp;nbsp;to both PageData, and ContentReference type. We then utilize these methods for querying:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;    public static class CmsModelsExtension
    {
        public static string Url(this SitePageData pageData)
        {
            return string.Empty;
        }
        public static string Url(this ContentReference content)
        {
            return string.Empty;
        }
        public static IEnumerable&amp;lt;string&amp;gt; ContentType(this SitePageData pageData)
        {
            return Array.Empty&amp;lt;string&amp;gt;();
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then you can use those methods for field selecting, filtering, and faceting.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;var query = _client
                .OperationName(&quot;Alloy_Sample_Query&quot;)
                .ForType&amp;lt;SitePageData&amp;gt;()
                    .Skip(0)
                    .Limit(10)
                    .Fields(x=&amp;gt; x.Url(), x=&amp;gt; x.ParentLink.Url(), x=&amp;gt; x.ContentLink.Url())
                    .Filter(x=&amp;gt; x.Url().MatchPrefix(&quot;https&quot;))
                    .Search(q)
                    .FilterForVisitor()
                    .Facet(x=&amp;gt;x.ContentType().FacetFilters(t));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This way is also useful when you need to select any property in IEnumerable&amp;lt;Your_Data_Type&amp;gt;&lt;span&gt;. Just create an extension method with the same name as your property and return the appropriate type.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Example to select &lt;em&gt;DisplayName &lt;/em&gt;from proprerty ExistingLanguages (IEnumerable&amp;lt;CultureInfo&amp;gt;) in SitePageData:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;public static class CmsModelsExtension
{
      ...
      public static string DisplayName(this IEnumerable&amp;lt;CultureInfo&amp;gt; cultures)
      {
          return string.Empty;
      }
}
query.Field(x=&amp;gt; x.ExistingLanguages.DisplayName());
query.Filter(x=&amp;gt; x.ExistingLanguages.DisplayName().Eq(&quot;English&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Updating Properties for ContentApiModel (Not recommend)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Another approach involves tweaking the schema models to closely resemble CMS models by adding or removing properties on the ContentApiModel. While technically feasible, we advise caution with this method. It could potentially introduce redundant properties and complicate debugging processes.&lt;/p&gt;
&lt;p&gt;In conclusion, whether you opt for the convenience of the generation tool or the flexibility of extension methods, rest assured that we&#39;re committed to providing you with the tools and techniques needed to navigate the intricate landscape of CMS models.&lt;/p&gt;</id><updated>2024-04-04T10:15:49.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Introducing Optimizely Graph Client and its advantages</title><link href="https://world.optimizely.com/blogs/manh-nguyen/dates/2024/3/introducing-optimizely-graph-client-and-its-advantages/" /><id>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nuget.optimizely.com/package/?id=Optimizely.Graph.Client&quot;&gt;Optimizely Graph Client&lt;/a&gt; was introduced in mid of March 2024 as a lightweight package that mostly supports generating query to our Optimizely Graph service, but you can use that package for your own GraphQL server.&lt;/p&gt;
&lt;p&gt;Optimizely Graph Client plays pivotal roles in facilitating seamless interaction with GraphQL APIs and offers distinct advantages for customers seeking simplicity and efficiency. We&#39;ll explore how the Optimizely Graph Client eliminates the need for GraphQL expertise by leveraging LINQ expressions and fluent interfaces, ultimately enhancing the user experience and accelerating development phrase.&lt;/p&gt;
&lt;p&gt;You could find the documentation about the package for developers on our &lt;a href=&quot;https://docs.developers.optimizely.com/platform-optimizely/v1.4.0-optimizely-graph/docs/introduction&quot;&gt;Dev guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Simplifying Query Builder&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For some kind of other tools that require you first to write a GraphQL query into a file and then generate it into C# code, this approach needs to re-generate the client file every time you update your GraphQL query.&lt;/p&gt;
&lt;p&gt;With our Optimizely Graph Client, one of the primary advantages is its ability to simplify query builder for developers with limited GraphQL knowledge. While other tools require developers to craft GraphQL queries manually, the Optimizely Graph Client reduces the complexity by allowing developers to express their query requirements using familiar LINQ (Language Integrated Query) and chainable methods. This intuitive approach empowers developers to focus on defining their data requirements in a familiar programming paradigm, without the need to delve into the intricacies of GraphQL syntax.&lt;/p&gt;
&lt;p&gt;If you were using FIND (Search &amp;amp; Navigation) client packages you could see a very similar syntax to build a search query to Graph service by leveraging LINQ Expressions and fluent interfaces.&lt;/p&gt;
&lt;p&gt;An example to express how to build a simple search query on Alloy site:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;public class SearchPageController : PageControllerBase&amp;lt;SearchPage&amp;gt;
    {
        private GraphQueryBuilder _queryBuilder;
        public SearchPageController(GraphQueryBuilder queryBuilder)
        {
            _queryBuilder = queryBuilder;
        }

        public ViewResult Index(SearchPage currentPage, string q, string t, string p = &quot;1&quot;)
        {
            var query = _queryBuilder
                .OperationName(&quot;Alloy_Sample_Query&quot;)
                    .ForType&amp;lt;SitePageData&amp;gt;()
                    .Skip((0)
                    .Limit(10)
                    .Fields(x=&amp;gt;x.Name, x=&amp;gt; x.Url, x=&amp;gt; x.MetaTitle, x=&amp;gt; x.MetaDescription)
                    .Total()
                    .Search(q)
                    .FilterForVisitor()
                    .UsingSynonyms()
                    .Facet(x=&amp;gt;x.ContentType.FacetFilters(t));
            var content = query.GetResultAsync&amp;lt;SitePageData&amp;gt;().Result.Content;
            var model = new SearchContentModel(content);
            return View(model);
        }
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The GraphQL query should looks like:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;query Alloy_Sample_Query {
  SitePageData(
    skip: 0
    limit: 10
    where: { _fulltext: { match: &quot;plan&quot; }, Status: { eq: &quot;Published&quot; } }
  ) {
    items {
      Name
      Url
      MetaDescription
      MetaTitle
    }
    facets {
      ContentType(filters: [&quot;PageData&quot;]) {
        name
        count
      }
    }
    total
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Query Generation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Optimizely Graph Client excels in dynamically generating GraphQL queries based on user-defined criteria expressed at runtime. This dynamic query generation capability allows for dynamic customization based on user input or changing requirements. Developers can specify filtering, sorting, or other criteria dynamically, leading to more flexible and adaptable queries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Personalization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By defining query criteria dynamically, developers can fetch targeted data relevant to their requirements. This personalized approach to data retrieval fosters a deeper understanding of user behavior, enabling data-driven decision-making and more effective optimization strategies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enhanced Productivity and Efficiency&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By eliminating the need for manual GraphQL query scripting, the Optimizely Graph Client significantly enhances productivity and efficiency for developers. You can build your complex query with just a few lines of code. Instead of managing static queries, developers can focus on building flexible query generation mechanisms that can adapt to changing requirements over time and do not need to keep track of all your queries in some script files anymore. Otherwise, with this approach you can make the unit test or integration test easier to use and your code easy to debug.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In conclusion, the Optimizely Graph Client is a compelling choice for customers who are seeking simplicity, efficiency, and seamless integration in their experimentation and optimization endeavors. Optimizely Graph Client empowers developers to interact with Optimizely GraphQL API intuitively, without requiring specialized knowledge of GraphQL syntax. This approach not only enhances productivity and efficiency but also accelerates experimentation workflows, enabling organizations to unlock the full potential of digital optimization with ease.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Looking Ahead&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Currently, the source code is publicly available in our &lt;a href=&quot;https://www.github.com/episerver/graph-net-sdk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github repository&lt;/a&gt; for any contributor. We&amp;rsquo;re continuously refining and enhancing the functionalities for the package. Your feedback and your ideas are invaluable in this ongoing process. Please do not hesitate to raise issues or create pull requests to our repository.&lt;/p&gt;</id><updated>2024-04-01T07:39:07.0000000Z</updated><summary type="html">Blog post</summary></entry></feed>