https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/SAP-Graph-blog-posts.xmlSAP Community - SAP Graph2026-02-16T21:01:04.478508+00:00python-feedgenSAP Graph blog posts in SAP Communityhttps://community.sap.com/t5/technology-blog-posts-by-sap/information-map-introduction-series-graph-in-sap-integration-suite/ba-p/13614448Information Map – Introduction Series: Graph in SAP Integration Suite2024-02-21T15:10:07.961000+01:00Palakhttps://community.sap.com/t5/user/viewprofilepage/user-id/17091<P>Graph is a powerful enhancement to API Management, capability of SAP Integration Suite , which supports in transforming APIs. You can easily and securely, provide your integration and application developers with selective, abstracted access to your enterprise data via a single, easy-to-use API. The enterprise data is semantically connected in the form of a business data graph.</P><P>This series is designed to support SAP customers and partners through building a first end-to-end implementation of Graph. To keep things straightforward, there are two personas in an end-to-end Graph implementation, which have the following responsibilities:</P><UL><LI>Administrator<UL><LI>Configures the SAP Integration Suite service plan in SAP BTP, as well as SAP BTP users and their roles</LI><LI>Enables connectivity to business systems in the form of SAP BTP destinations</LI><LI>Creates a business data graph (including model extensions, as required)</LI><LI>Explores the resulting business data graph in the Graph Navigator tool</LI><LI>Prepares the credentials file to the business data graph for the developer</LI></UL></LI></UL><P> </P><UL><LI><SPAN> Developer</SPAN><BR /><UL><LI>Uses the Graph Navigator tool to explore the connected entities and try out OData queries on the real data included in the business data graph</LI><LI>Creates and deploys an application which uses the Graph API (and the credentials file for the business data graph)</LI></UL></LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Palak_0-1710760949331.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82332iEADA9689585EC183/image-size/large?v=v2&px=999" role="button" title="Palak_0-1710760949331.png" alt="Palak_0-1710760949331.png" /></span></P><P><STRONG>Available introduction series parts</STRONG></P><UL><LI>Announcement - Graph: new in SAP Integration Suite - <A href="https://blogs.sap.com/2023/07/12/graph-new-in-sap-integration-suite/" target="_blank" rel="noopener noreferrer">https://blogs.sap.com/2023/07/12/graph-new-in-sap-integration-suite/</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-tutorial-part-1-introduction-to-graph-in-sap-integration-suite/ba-p/13615255" target="_self">Part 1: Introduction to Graph in SAP Integration Suite</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-2-set-up-graph-in-sap-integration-suite/ba-p/13616727" target="_self">Part 2: Set up Graph in SAP Integration Suite</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-3-construct-and-explore-a-business-data-graph/ba-p/13616707" target="_self">Part 3: Construct a Business Data Graph</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-4-hello-graph-write-your-first-graph-application/ba-p/13620393" target="_self">Part 4: Hello Graph! Write your first Graph application</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-5-use-graph-securely-with-real-data-authentication/ba-p/13622195" target="_self">Part 5: Use Graph securely with authentication</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/api-composition-with-graph-customizing-your-business-data-graphs-with-model/ba-p/13639447" target="_self">Part 6: API Composition with Graph: customizing your Business Data Graphs with Model Extensions</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-7-key-mapping-with-graph/ba-p/13511080" target="_self">Part 7: Use key mapping with Graph</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-8-use-graph-with-odata-v4/ba-p/13641190" target="_self">Part 8: Use OData v4 with Graph</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-9-use-graph-with-graphql/ba-p/13623717" target="_self">Part 9: Use GraphQL with Graph</A></LI><LI><A title="Part 10: Configure a Business Data Graph with REST data sources" href="https://community.sap.com/t5/technology-blog-posts-by-sap/use-rest-services-in-graph/ba-p/14311245" target="_blank">Part 10: Configure a Business Data Graph with REST data sources</A></LI></UL><P>________________________________________________________________</P><P>Palak Garg, Product Manager – SAP Integration Suite</P><P><A href="https://pages.community.sap.com/topics/graph" target="_self" rel="noopener noreferrer">Learn more about Graph in the SAP Community</A></P>2024-02-21T15:10:07.961000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/graph-intro-series-part-1-introduction-to-graph-in-sap-integration-suite/ba-p/13615255Graph intro series, part 1: Introduction to Graph in SAP Integration Suite2024-02-22T15:40:46.459000+01:00Chaim_Bendelachttps://community.sap.com/t5/user/viewprofilepage/user-id/194397<P>Hello, and welcome to the <EM>first</EM> in a tutorials series about the Graph functionality of API Management, a main capability of the SAP Integration Suite. In this series, we will take you from learning about what Graph is, to creating your own business data graphs with custom model extensions, all the way to becoming a developer who is proficient in using Graph as an access point to your business data, regardless of where this data resides.</P><P>For an overview of other parts of this series, check out the <A href="https://community.sap.com/t5/technology-blogs-by-sap/information-map-end-to-end-tutorial-graph-in-sap-integration-suite/ba-p/13614448" target="_blank">Information Map.</A></P><P>With Graph, you create an abstraction of business objects (aka <I>entities</I>) available in your landscape of business systems, in the form of a <I>business data graph.</I> The business data graph exposes the data of these business objects through a single, unified API. Application developers use powerful OData v4 or GraphQL commands to access only the data required to build the application and do not need to concern themselves with the complexities of the underlying data source systems.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="chaimbendelac_0-1708608275029.png" style="width: 461px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69353iBAEC3F905D422068/image-dimensions/461x479?v=v2" width="461" height="479" role="button" title="chaimbendelac_0-1708608275029.png" alt="chaimbendelac_0-1708608275029.png" /></span></P><P>SAP is famous for its ERP software, but today SAP customers have increasingly more complex requirements and are managing intricate and hybrid on-premise and cloud solutions. Customers want to become Intelligent Enterprises. To support their journey, SAP has augmented its ERP-centric business suite with substantial additional functions through the acquisition of cloud solutions like SAP SuccessFactors, SAP Concur and SAP Ariba. SAP’s Intelligent Suite portfolio now supports all key business processes and span all enterprise functions, but this expanded role and diversity of solutions has introduced some complexity. Many of SAP suite’s products have their own <EM>stack</EM>: overlapping data models, different APIs and heterogenous infrastructures, and this complexity is not always well hidden from SAP’s customers.</P><P>From the perspective of a software developer, this means that accessing SAP-managed data has become more complex. Data may be federated across hybrid networks of on-premise and cloud systems with different security protocols, replication processes and multiple master data copies. You don’t only have to worry about the data you are interested in, you have to know which copy you need, where that data exactly is located, and how to deal with connecting to these different customer systems. Different products have different connection protocols, security requirements and APIs, and those APIs expose data using different and inconsistent data models. Developing SAP extension apps requires mastering a broad set of skills for even the simplest data queries, and the applications you develop are sensitive to the smallest product and landscape configuration changes.</P><P>This is the problem that Graph addresses.</P><P>Graph is a new <EM>unified API</EM> for SAP. It addresses this run-away API complexity and integration challenge by providing developers a single <EM>connected</EM> and <EM>unified</EM> view of all their business data, consolidating the data models of data sources like SAP S/4HANA, SAP Sales Cloud and SAP SuccessFactors into one, unified and connected, data model, representing all the data in a landscape. We call this the <EM>Business Data Graph</EM>.</P><P>A data graph is a connected graph, with data entities serving as the nodes of the graph and edges that represent relationships (which we call <EM>associations</EM>) between those entities. The nodes of the Business Data Graph are the common enterprise business objects, like Customer, Supplier, Product, Sales and Purchase Order, General Ledger, etc.</P><P>As a developer, you face a dilemma. The concept of a Product or a Customer is common to many of the business systems that make up a landscape. Which of these definitions should you use? Where in the landscape is this data managed? Graph addresses this dilemma by introducing <EM>unified</EM> entities that provide the most common attributes of a business model for easy consumption and connect to the corresponding system-specific business objects for a full 360° view of the business object. You get to have your cake and eat it too: use the unified entities for simple use-cases, and easily access over 1,500 additional system-specific entities for advanced usage.</P><P>To illustrate these aspects of the business data graph, it is best if we start with a simple example taken from the enterprise world of sales. A salesperson entered a quote on behalf of a customer.</P><P>This quote is represented by a unified <STRONG>SalesQuote</STRONG> entity. The quote has an association to a <STRONG>Customer</STRONG> entity. The quote also has multiple items, each of which refer to a <STRONG>Product</STRONG> entity, which in turn has multiple associations to other entities, like <STRONG>Division</STRONG>. This is illustrated below:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="chaimbendelac_1-1708608306473.png" style="width: 628px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69356iB3FC13B850289DF9/image-dimensions/628x274?v=v2" width="628" height="274" role="button" title="chaimbendelac_1-1708608306473.png" alt="chaimbendelac_1-1708608306473.png" /></span></P><P> </P><P>Each entity has many additional <EM>attributes</EM>, such as a key (called <STRONG>id</STRONG> in unified entities), and various other attributes, which can be flat, arrays, or more complex structured compositions of other attributes. For instance, <STRONG>items</STRONG> is an array of a structured type.</P><P>With Graph you navigate to and access the data you need, regardless of where this data resides. Graph <EM>abstracts</EM> the physical landscape and the details of the different product stacks and offers you a simple view of the SAP-managed data, which you can access through a single API, spanning all key use cases. Graph accesses the data in the customer-configured landscape on your users’ behalf, technically acting as middleware. Graph itself doesn’t store or cache any data.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="chaimbendelac_2-1708608306481.png" style="width: 470px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69355i4D4735F7D34105FC/image-dimensions/470x457?v=v2" width="470" height="457" role="button" title="chaimbendelac_2-1708608306481.png" alt="chaimbendelac_2-1708608306481.png" /></span></P><P>The above illustration shows your app accessing quote, product, customer and supplier data – but the app cannot tell if this is data is accessed from an on-premise SAP S/4 HANA system, SAP Sales Cloud or another system, like SAP Ariba. This will be determined by the specific landscape configuration that Graph accesses on behalf of the app user. As a developer, you are exempted from knowing these system details, or how to access data in these heterogenous systems. More importantly, your application will be portable across multiple and diverse landscapes without changes to your code.</P><P>But what if your app requires detailed attribute information that is not modeled in the unified entity? For instance, your app may be interested in Product inventory information, that is unique to data sources of type S/4HANA. No problem! Simply navigate over the <STRONG>_s4</STRONG> association to access the required information, like the <STRONG>CountryOfOrigin </STRONG>of the product, or navigate further via the <STRONG>to_ProductStorage</STRONG> association.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="chaimbendelac_3-1708608306487.png" style="width: 589px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69354iB94D13058B7475A3/image-dimensions/589x250?v=v2" width="589" height="250" role="button" title="chaimbendelac_3-1708608306487.png" alt="chaimbendelac_3-1708608306487.png" /></span></P><P>The unified entities introduced here are actually examples of a much more powerful capability of Graph: the ability to create your own <EM>custom</EM> entities and model extensions, effectively allowing you to create your own landscape and data abstraction. We will discuss how to create your own custom entities and model extensions in a subsequent blog in this series.</P><P>Graph currently supports the <EM>OData v4</EM> and <EM>GraphQL</EM> protocol to access the business data graph. OData (<EM>Open Data</EM>) is a widely used OASIS standard that defines a set of best practices for using RESTful data APIs.</P><P>As we shall see, OData and GraphQL APIs are easy and powerful to consume. OData requests operate on <EM>resources</EM>, the data, and extends this with query options, that let you shape the response to queries. The resources of Graph are the entities of the business data graph. GrphQL offer a similar experience, with a more intuitive syntax.</P><H2 id="toc-hId-987071930"><STRONG>Exploring Graph using the Graph Navigator</STRONG></H2><P>The Graph of SAP systems is documented by the <A href="https://hub.sap.com/graph" target="_blank" rel="noopener noreferrer">Graph Navigator</A> on SAP Business Accelerator Hub. Go ahead and follow the link to the Graph Navigator to explore the the full graph of SAP systems. The index, on the left of the application, shows you over 1,500 entities grouped by data source. The first group of entities, in the sap.graph namespace, are the unified entities. Here is an example of a unified entity, the <STRONG>sap.graph/WorkAssignment. </STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="chaimbendelac_4-1708608306500.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69357i39FA13252419EB1E/image-size/large?v=v2&px=999" role="button" title="chaimbendelac_4-1708608306500.png" alt="chaimbendelac_4-1708608306500.png" /></span></P><P>Unified entities have a key, called <STRONG>id</STRONG>. You can see other attributes, like <STRONG>workforcePerson</STRONG>, the identifier of the person whose assignment this is. You can also see an <EM>association </EM>(a link) to the details of this person, another entity unsurprisingly called <STRONG>sap.graph/WorkforcePerson</STRONG>. Another interesting attribute is <STRONG>jobInfo</STRONG>. This is a <EM>composition</EM>, in this case of composition of many”, which you can think of as an array of this structure. Click on the little <STRONG>></STRONG> arrow to see what it looks like, or study the example on the right, where you can see an array of one instance.<BR />Finally, it is worth pointing out two more interesting associations, <STRONG>_cxsales </STRONG>and <STRONG>_hcm</STRONG>. These are links to the respective system-specific entities, <STRONG>sap.cxsales/EmployeeCollection</STRONG> and <STRONG>sap.hcm/EmpEmployment</STRONG>. They enable developers to augment the information available in the unified entity with system-specific attributes, and make the business data graph a connected and navigable graph of the entire enterprise landscape. Go ahead, click around the Graph Navigator to get a sense of what the full SAP-based business data graph looks like.</P><P>With this quick introduction out of the way, follow us to the next part of the blog series where we set up Graph in SAP Integration Suite.</P><P>________________________________________________________________<BR /><STRONG>Chaim Bendelac, Chief Product Manager – API Management and Graph<BR /></STRONG>Visit <A href="https://pages.community.sap.com/topics/graph" target="_self" rel="noopener noreferrer">Graph</A> on the SAP Community</P>2024-02-22T15:40:46.459000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/graph-intro-series-part-2-set-up-graph-in-sap-integration-suite/ba-p/13616727Graph intro series, part 2: Set up Graph in SAP Integration Suite2024-02-23T09:37:46.550000+01:00HamidrezaLalehhttps://community.sap.com/t5/user/viewprofilepage/user-id/81956<P>In this part we address you, a person with an IT administrative role and responsibilities for enterprise data. Please refer to <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-1-introduction-to-graph-in-sap-integration-suite/ba-p/13615255" target="_self">Part 1</A> for an introduction to Graph, and to the <A href="https://community.sap.com/t5/technology-blogs-by-sap/information-map-introduction-series-graph-in-sap-integration-suite/ba-p/13614448" target="_self">Information Map</A> for an overview of the entire tutorial series.</P><P>As always, you can find all the details for what we are going to discuss here in the Graph documentation on the SAP Help Portal.</P><H2 id="toc-hId-987106435"><STRONG>The SAP Business Technology Platform (SAP BTP)</STRONG></H2><P>Enterprises and other companies deploy a variety of business software solutions to manage their major business processes. We refer to these software systems as <EM>data sources</EM>, and to the collection of data sources as the <EM>landscape</EM>. As we shall see, the business data graph is a connected graph of the business data in your landscape.</P><P>Enabling access to a landscape involves a great many concerns, related to connectivity, user management, trust, and other security topics. Establishing these aspects is exactly the role of SAP’s <STRONG>Business Technology Platform </STRONG>(SAP BTP), available on multiple cloud infrastructure providers. As an owner of data sources, you use the <STRONG>SAP BTP cockpit </STRONG>as the central point of entry, where you can access your accounts manage all activities associated with them.</P><P>Graph is a powerful addition to the API Management capability in SAP Integration Suite. Graph can be used in any SAP Integration Suite plan where API Management is available (including SAP BTP trial accounts), but not necessarily in every region where API Management is available. For more details about the regional availability of Graph, be sure to check out <SPAN><A href="https://launchpad.support.sap.com/#/notes/3338820" target="_blank" rel="noopener noreferrer">SAP Note 3338820</A></SPAN>. </P><H2 id="toc-hId-790592930"><STRONG>Configuring Graph</STRONG></H2><P>If you are not familiar with the SAP BTP cockpit, there are many blogs, videos and tutorials (like <SPAN><A href="https://discovery-center.cloud.sap/missiondetail/3019/3297" target="_blank" rel="noopener nofollow noreferrer">this one</A></SPAN>) to make you feel at home. Here we will assume some familiarity with the SAP BTP Cockpit to apply the following process:</P><OL><LI>Create a subaccount, which represents your landscape</LI><LI>Create the SAP Integration Suite service</LI><LI>Add Graph to SAP Integration Suite</LI><LI>Assign yourself Graph roles in SAP BTP </LI><LI>Set up destinations to the data sources of your landscape</LI><LI>Generate credentials, by creating a service binding</LI></OL><H3 id="toc-hId-723162144">Step 1: Create a subaccount</H3><P>Use the SAP BTP cockpit to login to your “global” account. Create a subaccount:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HamidrezaLaleh_0-1708674971710.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69739i26386F00D83A28CC/image-size/medium?v=v2&px=400" role="button" title="HamidrezaLaleh_0-1708674971710.png" alt="HamidrezaLaleh_0-1708674971710.png" /></span></P><P> </P><UL><LI>Enter the subaccount display name, for instance Graph Sandbox (this will also fill the <STRONG>subdomain</STRONG> field with a unique string)</LI><LI>Set <STRONG>Region</STRONG>, for example to Europe (Frankfurt) under Amazon Web Services (<STRONG>CF-EU10</STRONG>).</LI></UL><P>Click <STRONG>Create</STRONG>; wait until the subaccount is created.</P><P>Next, enter the subaccount by clicking on its tile, select <STRONG>Entitlements</STRONG> from the left-side menu, click <STRONG>Configure Entitlements</STRONG> and then <STRONG>Add Service Plans</STRONG>, search for <STRONG>SAP Integration Suite,</STRONG> check the plan you wish to use, and confirm by clicking the <STRONG>Add 1 Service Plan</STRONG> button. Don’t forget to click <STRONG>Save</STRONG>.</P><P>Note: The SAP Integration Suite trial plan is automatically entitled for the default SAP BTP Trial subaccount, and Graph can also be seamlessly deployed there.</P><H3 id="toc-hId-526648639">Step 2: Create the SAP Integration Suite service</H3><P>In the SAP BTP cockpit, select <STRONG>Instances and Subscriptions</STRONG> from the left-side menu, click <STRONG>Create</STRONG> and then configure the SAP Integration Suite service with your desired plan.</P><P>Then select <STRONG>Security > Users</STRONG> from the left-side menu and assign your user the <EM>Integration_Provisioner</EM> role collection. You can do this by clicking the user name, and then selecting ‘<STRONG>…</STRONG>’ under the <STRONG>Role Collections</STRONG> table. Find the <EM>Integration_Provisioner</EM> role collection and assign it.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HamidrezaLaleh_1-1708674971717.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69740i90AD427C2600A508/image-size/large?v=v2&px=999" role="button" title="HamidrezaLaleh_1-1708674971717.png" alt="HamidrezaLaleh_1-1708674971717.png" /></span></P><P> </P><H3 id="toc-hId-330135134">Step 3: Add Graph to SAP Integration Suite</H3><P>At this point, you should have an SAP Integration Suite application that you can access and add capabilities to. Go to Instances and Subscriptions in the left-side menu, and open the SAP Integration Suite application.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HamidrezaLaleh_2-1708674971723.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69741iA494DED41F385FBB/image-size/large?v=v2&px=999" role="button" title="HamidrezaLaleh_2-1708674971723.png" alt="HamidrezaLaleh_2-1708674971723.png" /></span></P><P> </P><P>Select <STRONG>Add Capabilities</STRONG> to open a menu where you can select <STRONG>Manage APIs</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HamidrezaLaleh_3-1708674971728.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69743iE0CF630DC2A66E9A/image-size/large?v=v2&px=999" role="button" title="HamidrezaLaleh_3-1708674971728.png" alt="HamidrezaLaleh_3-1708674971728.png" /></span></P><P> </P><P>By clicking <STRONG>Next</STRONG>, you are taken to the API Management setup step where you must enable both <EM>API Business Hub Enterprise</EM> and <EM>Graph</EM>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HamidrezaLaleh_4-1708674971731.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69744i007547D475FCD0BB/image-size/large?v=v2&px=999" role="button" title="HamidrezaLaleh_4-1708674971731.png" alt="HamidrezaLaleh_4-1708674971731.png" /></span></P><P> </P><P>Finally, select <STRONG>Activate</STRONG> and wait for the newly configured capability to show ‘Active’ for all selected features.</P><H3 id="toc-hId-133621629">Step 4: Assign yourself Graph roles in SAP BTP </H3><P>Graph has two dedicated SAP BTP role collections: Graph.KeyUser and GraphNavigator.Viewer. The role collection GraphNavigator.Viewer provides access to explore the entities and try out OData queries on the real data reflected in the business data graphs in the SAP BTP subaccount in the Graph Navigator tool in SAP API Business Hub Enterprise. This role collection is relevant for developer persona.</P><P>The role collection Graph.KeyUser is required to configure business data graphs in the SAP Integration Suite application. The Graph.KeyUser role collection also includes navigator viewer role to access Graph navigator.</P><P>Select Security > Users from the left-side menu and assign your user the Graph.KeyUser role collection. You can do this by clicking the username, and then selecting ‘…’ under the Role Collections table. Find the role collection and assign it.</P><P>At this point, you should be able to navigate to the Graph user interface in the SAP Integration Suite application. You can open the Graph user interface from the SAP Integration Suite application left-side menu under Design Artifacts. We will come back to the Graph user interface in the next part of the blog tutorial series. The rest of the blog focuses on the remaining setup in the SAP BTP cockpit.</P><H3 id="toc-hId--62891876">Step 5: Create destinations</H3><P>In this tutorial, we will use the SAP Business Accelerator Hub sandbox systems as data sources. Note that creating destinations to other data sources is often more complex, due to trust establishment. Refer to the Graph documentation for more information.</P><P>Within the same subaccount, select <STRONG>Connectivity / Destinations</STRONG> from the left-side menu and click <STRONG>New Destination</STRONG>, as follows:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HamidrezaLaleh_5-1708674971733.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69742i50D1CA1EA69F080F/image-size/medium?v=v2&px=400" role="button" title="HamidrezaLaleh_5-1708674971733.png" alt="HamidrezaLaleh_5-1708674971733.png" /></span></P><P> </P><P>Fill in the form as follows to create a destination to the SAP CX Sales Cloud sandbox system:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HamidrezaLaleh_6-1708674971736.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69745i0236136BF1D9D07C/image-size/large?v=v2&px=999" role="button" title="HamidrezaLaleh_6-1708674971736.png" alt="HamidrezaLaleh_6-1708674971736.png" /></span></P><P> </P><P>Use cxsalescloud as the name and <A href="https://sandbox.api.sap.com/sap/c4c/odata/v1/c4codataapi/" target="_blank" rel="noopener noreferrer">https://sandbox.api.sap.com/sap/c4c/odata/v1/c4codataapi/</A> as the URL.</P><P>Since the sandbox APIs require an API key in HTTP headers, we will add this header. Click <STRONG>New Property</STRONG>, then enter <STRONG>URL.headers.apiKey</STRONG> as property name and enter your unique API key from the SAP Business Accelerator Hub as the value. Then <STRONG>Save</STRONG>.</P><P>You can easily repeat this process to create additional destinations, by cloning this destination, and changing the <STRONG>Name</STRONG> and <STRONG>URL</STRONG> fields. Go ahead, and add another destination named s4_product, with the following URL: <A href="https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata/sap/API_PRODUCT_SRV" target="_blank" rel="noopener noreferrer">https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata/sap/API_PRODUCT_SRV</A></P><P>Here are additional useful API services to consider:</P><UL><LI>SAP SuccessFactors: <U><A href="https://sandbox.api.sap.com/successfactors/odata/v2" target="_blank" rel="noopener noreferrer">https://sandbox.api.sap.com/successfactors/odata/v2</A></U></LI><LI>SAP S/4HANA Business Partner: <U><A href="https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata/sap/API_BUSINESS_PARTNER" target="_blank" rel="noopener noreferrer">https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata/sap/API_BUSINESS_PARTNER</A></U></LI><LI>SAP S/4HANA Sales Order: <U><A href="https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata/sap/API_SALES_ORDER_SRV" target="_blank" rel="noopener noreferrer">https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata/sap/API_SALES_ORDER_SRV</A></U></LI></UL><H3 id="toc-hId--259405381"> </H3><H3 id="toc-hId--455918886"> </H3><H3 id="toc-hId--652432391">Step 6: Create a Graph service instance</H3><P>To consume your Business Data Graph OData endpoint, you need to have service credentials to get a valid token. To do so within the same subaccount, select <STRONG>Services / Instances and Subscriptions</STRONG> from the left-side menu, and then click <STRONG>Create</STRONG> in the top-right corner.</P><P>In the wizard:</P><OL><LI>Select <STRONG>Process Integration Runtime</STRONG> from the drop-down service menu.</LI><LI>Select the <STRONG>integration-flow </STRONG>service plan.</LI><LI>Select <STRONG>Cloud Foundry</STRONG> as runtime environment and select the space.</LI><LI>Enter an instance name. For example, sapgraph1. Choose <STRONG>Create</STRONG>.</LI><LI>Click the three dots to the right of the created instance and select <STRONG>Create Service Key </STRONG>(for more info check Graph documentation <A title="Graph documentation regarding Enable Client Applications" href="https://help.sap.com/docs/graph/graph/enabling-client-applications" target="_self" rel="noopener noreferrer">here</A>).</LI><LI><STRONG><SPAN class=""><SPAN class="">Download </SPAN></SPAN></STRONG><SPAN class=""><SPAN class="">and save the created credentials as a text file:</SPAN></SPAN></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HamidrezaLaleh_8-1708674971736.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69746iC98B8F1E4EDD69A8/image-size/medium?v=v2&px=400" role="button" title="HamidrezaLaleh_8-1708674971736.png" alt="HamidrezaLaleh_8-1708674971736.png" /></span></P><P> </P><H2 id="toc-hId--630774258"><STRONG>In summary</STRONG></H2><P>The steps above complete the configuration of the landscape and the preparations for creating a business data graph for your developers. The final step is to create the business data graph itself – this will be the topic of the <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-3-construct-and-explore-a-business-data-graph/ba-p/13616707" target="_self">next part</A> of this tutorial series.</P><P><SPAN>________________________________________________________________</SPAN><BR /><STRONG>Hamid Reza Laleh, Product Owner – Graph<BR /></STRONG><SPAN>Visit </SPAN><A href="https://pages.community.sap.com/topics/graph" target="_self" rel="noopener noreferrer">Graph</A><SPAN> on the SAP Community</SPAN></P>2024-02-23T09:37:46.550000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/graph-intro-series-part-3-construct-and-explore-a-business-data-graph/ba-p/13616707Graph intro series, part 3: Construct and explore a Business Data Graph2024-02-23T09:38:54.537000+01:00marc_vornetranhttps://community.sap.com/t5/user/viewprofilepage/user-id/700240<P><SPAN>In this part of the </SPAN><SPAN>series </SPAN><SPAN>on Graph – the new API for connecting to your business data – we will discuss the concepts and configuration of the </SPAN><I><SPAN>Business Data Graph</SPAN></I><SPAN>. Please refer to th</SPAN><SPAN>e </SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/information-map-multi-part-tutorial-graph-in-sap-integration-suite/ba-p/13614448" target="_self">Information Map</A> <SPAN>to see all parts of this</SPAN> <SPAN>series. The</SPAN><SPAN> Graph documentation </SPAN><SPAN>on the <A href="https://help.sap.com/docs/graph?locale=en-US&state=PRODUCTION&version=PROD" target="_self" rel="noopener noreferrer">Help Portal</A> provides an in-depth look at many of the concepts featured in this part. </SPAN><SPAN> </SPAN></P><P><SPAN>The <EM>“data graph”</EM> concept is central to the Graph capability. The business data graph is essentially the artifact that connects the business data together. The administrator is responsible for creating and shaping how the data in the business systems is reflected in the business data graph. </SPAN><SPAN> </SPAN></P><P><SPAN>A data graph consists of </SPAN><STRONG><SPAN>mirrored entities</SPAN></STRONG><SPAN>, which are projections of the business objects that Graph automatically discovered in the business systems. They are mirrored one-to-one in the data graph and grouped in namespaces that correspond to each business system. Then the mirrored entities are connected through additional semantic connections. </SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_0-1708674195264.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69713i1B38CBA253DC54C5/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_0-1708674195264.png" alt="marc_vornetran_0-1708674195264.png" /></span></P><P><SPAN><BR />Additional projections, called </SPAN><STRONG><SPAN>unified entities</SPAN></STRONG><SPAN>, are created on top of the mirrored entities. They connect semantically common business concepts from multiple data sources and are created in the namespace <STRONG><FONT face="courier new,courier">sap.graph</FONT></STRONG>. It is also possible for customers to extend the data graph by creating </SPAN><STRONG><SPAN>custom entities</SPAN></STRONG><SPAN>. </SPAN><SPAN>We will address model extensions in a separate blog post.</SPAN><SPAN> </SPAN></P><P><SPAN>Finally, the data graph is activated to create a </SPAN><STRONG><SPAN>business data graph</SPAN></STRONG><SPAN>, which is a runtime artifact based on the configured data graph, and accessible as a unified API. </SPAN><SPAN> </SPAN></P><P><SPAN>The official documentation set provides goes more in-depth of what is described in this section and can be accessed here: </SPAN><A href="https://help.sap.com/docs/graph/graph/business-data-graph" target="_blank" rel="noopener noreferrer"><SPAN>SAP Help Portal: Graph - Business Data Graph</SPAN></A><SPAN> </SPAN><SPAN> </SPAN></P><P><SPAN>We pick up from where we left off at the end </SPAN><SPAN>of the previous blog</SPAN><SPAN>. You </SPAN><SPAN>previously set up Graph in SAP Integration Suite, </SPAN><SPAN>created destinations to data source endpoints, and assigned yourself the </SPAN><SPAN>dedicated Graph</SPAN><SPAN> role</SPAN><SPAN> collections</SPAN><SPAN>. Also, you </SPAN><SPAN>created a service binding for Graph and </SPAN><SPAN>generated and downloaded the credentials text file</SPAN><SPAN>.</SPAN><SPAN> </SPAN></P><P><SPAN>In the following steps, you will construct a business data graph from the data sources you previously configured as SAP BTP destinations and explore the business data graph in the Graph Navigator tool.</SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>Co</SPAN></STRONG><STRONG><SPAN>nstruct</SPAN></STRONG><STRONG><SPAN> the Business Data Graph </SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>1. In the SAP Integration Suite application, select <STRONG>Graph</STRONG> under Design Artifacts in the left-side menu.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_1-1708674195265.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69714i286E7EE533469178/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_1-1708674195265.png" alt="marc_vornetran_1-1708674195265.png" /></span></P><P> </P><P><SPAN>2. Select </SPAN><STRONG><SPAN>Create new business data graph </SPAN></STRONG><SPAN>in the center panel. </SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_2-1708674195266.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69715iD0714669275EF181/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_2-1708674195266.png" alt="marc_vornetran_2-1708674195266.png" /></span></P><P> </P><P><SPAN>3. Provide an </SPAN><STRONG><SPAN>ID </SPAN></STRONG><SPAN>for the business data Graph. Use lowercase letters, numbers, and hyphens. </SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_3-1708674195267.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69716iBA715D4118B293C9/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_3-1708674195267.png" alt="marc_vornetran_3-1708674195267.png" /></span></P><P> </P><P><SPAN>4. Select the <STRONG>data sources</STRONG> you would like to include in your business data graph. These are the destinations you previously configured in the SAP BTP cockpit. Select <STRONG>Next</STRONG>.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_4-1708674195268.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69717i1A629D028EA12672/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_4-1708674195268.png" alt="marc_vornetran_4-1708674195268.png" /></span></P><P> </P><P><SPAN>5. <STRONG>Skip</STRONG> the optional Model Extension step for now, by selecting <STRONG>Next</STRONG>. Your draft business data graph gets generated.</SPAN><SPAN> </SPAN></P><P><SPAN>6. </SPAN><SPAN>Review the configuration file and select <STRONG>Create</STRONG> to activate the business data graph.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_5-1708674195269.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69718iB788D9A4BD0CC4AE/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_5-1708674195269.png" alt="marc_vornetran_5-1708674195269.png" /></span></P><P> </P><P>7. <SPAN>Wait for the <STRONG>Status</STRONG> to update to be <STRONG><FONT face="courier new,courier">Available</FONT></STRONG>. Eventually, the status goes from <STRONG><FONT face="courier new,courier">Processing</FONT></STRONG> to <STRONG><FONT face="courier new,courier">Available</FONT></STRONG>.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_6-1708674195272.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69720iE7ACC681C3395695/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_6-1708674195272.png" alt="marc_vornetran_6-1708674195272.png" /></span></P><P> </P><P><STRONG>Note: </STRONG><SPAN>You can navigate to more information about individual business data graphs by selecting </SPAN><FONT face="courier new,courier"><STRONG><SPAN>></SPAN></STRONG></FONT><SPAN>. You can edit or delete the business data graph, or view the logs. </SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2024-02-23 at 09.12.22.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69767i38F081BB8B20879A/image-size/medium?v=v2&px=400" role="button" title="Screenshot 2024-02-23 at 09.12.22.png" alt="Screenshot 2024-02-23 at 09.12.22.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_8-1708674195273.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69721iEDEC60F9BCBF3160/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_8-1708674195273.png" alt="marc_vornetran_8-1708674195273.png" /></span></P><P> </P><P><STRONG><SPAN>Explore the business data graph in the Graph Navigator </SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>You just created your business data graph. Wouldn’t it be cool to explore the semantic connections between the data entities and even try out a few OData queries on the real data in the business systems? You can do exactly that using the Graph Navigator within API Business Hub Enterprise! This section takes you through exploring the business data graph you created in the previous section, using the Graph Navigator tool.</SPAN></P><P><SPAN>1. </SPAN><SPAN>Open the Graph Navigator tool in API Business Hub Enterprise by selecting the menu icon in the top panel and then <STRONG>Graph Navigator</STRONG>.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_9-1708674195275.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69724iDF8748DB91B17BC1/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_9-1708674195275.png" alt="marc_vornetran_9-1708674195275.png" /></span></P><P><SPAN>2. </SPAN><SPAN>The Graph Navigator automatically lists all the business data graphs in your SAP BTP subaccount. Select the business data graph you previously created.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_10-1708674195275.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69722i35BF1526738FF2E6/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_10-1708674195275.png" alt="marc_vornetran_10-1708674195275.png" /></span></P><P><SPAN>3. On the left, in the Entities index, you see a search window, and collections of the available entities, grouped per namespace.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_11-1708674195275.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69723iE46CCB1F2FE3FBBD/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_11-1708674195275.png" alt="marc_vornetran_11-1708674195275.png" /></span></P><P> </P><P><SPAN>4. </SPAN><SPAN>Depending on the data sources you included in your business data graph, you may have three namespaces containing the business objects from SAP SuccessFactors (</SPAN><FONT face="courier new,courier"><STRONG><SPAN>sap.hcm</SPAN></STRONG></FONT><SPAN>), SAP S/4 HANA (</SPAN><FONT face="courier new,courier"><STRONG><SPAN>sap.s4</SPAN></STRONG></FONT><SPAN>) and SAP Sales and Service Cloud (</SPAN><FONT face="courier new,courier"><STRONG><SPAN>sap.c4c</SPAN></STRONG></FONT><SPAN>).</SPAN> <SPAN>Open one of these three namespaces. For instance, pick the <STRONG><FONT face="courier new,courier">sap.c4c</FONT></STRONG> namespace, and then select </SPAN><STRONG><SPAN>SalesQuoteCollection </SPAN></STRONG><SPAN>under Sales Quote. </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_12-1708674195276.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69725i0270D27DEF47685D/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_12-1708674195276.png" alt="marc_vornetran_12-1708674195276.png" /></span></P><P> </P><P><SPAN>5. </SPAN><SPAN>You can easily see which operations are allowed (create, read, update, and delete), review the list of attributes, and see an actual data example. Take the time to explore the root entities (potentially representing 4,500+ entities and sub-entities in SAP systems), in the different namespaces, within the Graph Navigator context.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_13-1708674195277.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69726iD970371E3FF2A458/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_13-1708674195277.png" alt="marc_vornetran_13-1708674195277.png" /></span></P><P><SPAN>6. </SPAN><SPAN>Explore one of the unified entities in the <STRONG><FONT face="courier new,courier">sap.graph</FONT></STRONG> namespace, the top namespace in the list on the left. Unified entities are simplified projections on some of the most complex business objects in SAP systems. They are useful in particular for apps that only require basic, essential information.</SPAN><SPAN> </SPAN></P><P><SPAN>For instance, you can search for sales quote (or SalesQuote) in the search box on the left and pick the first search result: <STRONG><FONT face="courier new,courier">sap.graph/SalesQuote</FONT></STRONG>.</SPAN><SPAN> </SPAN></P><P><SPAN>This too is a synthetic entity, a projection, of the actual sales information in your systems.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_14-1708674195278.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69727i50DCA4B8F102D891/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_14-1708674195278.png" alt="marc_vornetran_14-1708674195278.png" /></span></P><P><SPAN>7. </SPAN><SPAN>Now switch to the <STRONG>Try Out</STRONG> tab at the top.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_15-1708674195278.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69728i20D65AE95ED31932/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_15-1708674195278.png" alt="marc_vornetran_15-1708674195278.png" /></span></P><P><SPAN>8. </SPAN><SPAN>You can see an OData request, for one record of <STRONG><FONT face="courier new,courier">sap.graph/SalesQuote</FONT></STRONG> ($top=1). Click Run. You will see your Sales Quote appear on the screen.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_16-1708674195278.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69729iCC63EE8A6EC3E64B/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_16-1708674195278.png" alt="marc_vornetran_16-1708674195278.png" /></span></P><P><SPAN>9. </SPAN><SPAN>Now let's have some fun. Use the <STRONG>$expand</STRONG> button to check <FONT face="courier new,courier"><STRONG>_salesOrganization</STRONG></FONT> and <FONT face="courier new,courier"><STRONG>_distributionChannel</STRONG></FONT>. Did you see how this automatically changed the OData request?</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_17-1708674195279.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69730iBA7FC9DDBB1837FB/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_17-1708674195279.png" alt="marc_vornetran_17-1708674195279.png" /></span></P><P><SPAN>10. </SPAN><SPAN>Click run to see the result of this query. Scroll down to see the expanded sales organization and distribution channel information. As you can see, this is a (mock) quote from one of BestRun's direct sales customers in the US.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_18-1708674195279.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69731i2A0F6A65F224DB49/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_18-1708674195279.png" alt="marc_vornetran_18-1708674195279.png" /></span></P><P><SPAN>11. </SPAN><SPAN>We could try out different variations of "$expand", to get of sense of all the data. Here is another fun query we can try:</SPAN></P><P><FONT face="courier new,courier"><STRONG>/sap.graph/SalesQuote?$top=1&$expand=items($expand=_product) </STRONG></FONT></P><P><SPAN>and learn that the customer was quoted a single calculator which is of product type 3.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_19-1708674195280.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69733i39FDD0D5162D1C52/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_19-1708674195280.png" alt="marc_vornetran_19-1708674195280.png" /></span></P><P><SPAN>12. </SPAN><SPAN>When dealing with a specific single record, we can also navigate across the data to access other pertinent information. First, let's expand the customer (a business partner) on our order to find out the type:</SPAN><SPAN> </SPAN></P><P><FONT face="courier new,courier"><STRONG>/sap.graph/SalesQuote/c4c~1?$expand=_soldToParty </STRONG></FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_20-1708674195280.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69732i2F3F67E898AC8DE5/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_20-1708674195280.png" alt="marc_vornetran_20-1708674195280.png" /></span></P><P><SPAN>13. </SPAN><SPAN>This is a corporation, so we can navigate to: </SPAN><SPAN> </SPAN></P><P><FONT face="courier new,courier"><STRONG><SPAN>/sap.graph/SalesQuote/c4c~1/_soldToParty/_corporateAccount </SPAN></STRONG><SPAN> </SPAN></FONT></P><P><SPAN>Let's also add some options to the query before we run it: </SPAN><SPAN> </SPAN></P><P><FONT face="courier new,courier"><STRONG><SPAN>/sap.graph/SalesQuote/c4c~1/_soldToParty/_corporateAccount?$expand=addresses,contacts </SPAN></STRONG></FONT><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_21-1708674195281.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69734i6389191072F159E0/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_21-1708674195281.png" alt="marc_vornetran_21-1708674195281.png" /></span></P><P><SPAN>14. </SPAN><SPAN>Expanding and navigating are two powerful capabilities. But what makes data graphs even more useful are queries that combine these capabilities with other features, such as: </SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>$select</SPAN></STRONG><SPAN>: return only the attributes you need </SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>$filter</SPAN></STRONG><SPAN>: use data selection criteria </SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>$orderby</SPAN></STRONG><SPAN>: return results in sort-order. </SPAN><SPAN> </SPAN></P><P><SPAN>For instance, the following query lists ten sorted (ascending order) quotes by <FONT face="courier new,courier"><STRONG>netAmount</STRONG></FONT> greater than 2000, with customer names and sales organization: </SPAN><SPAN> </SPAN></P><P><FONT face="courier new,courier"><STRONG><SPAN>/sap.graph/SalesQuote?$top=10&$expand=_soldToParty($select=name)&$filter=netAmount ge 2000&$select=id,netAmount,salesOrganization&$orderby=netAmount </SPAN></STRONG><SPAN> </SPAN></FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="marc_vornetran_22-1708674195282.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/69735i289B2C965A7CC386/image-size/medium?v=v2&px=400" role="button" title="marc_vornetran_22-1708674195282.png" alt="marc_vornetran_22-1708674195282.png" /></span></P><P> </P><P><STRONG><SPAN>In summary</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>This part of the series concludes the basic introduction to Graph. In</SPAN><SPAN> the <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-2-set-up-graph-in-sap-integration-suite/ba-p/13616727" target="_self">previous part</A>, </SPAN><SPAN>we learned how to set up a landscape for Graph, which we used in this part to create a business data graph</SPAN><SPAN> and explore it in the Graph Navigator tool.</SPAN><SPAN> </SPAN></P><P><SPAN>––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––</SPAN></P><P><SPAN><STRONG>Marc Vornetran</STRONG>, Product Owner – Graph in SAP Integration Suite</SPAN><SPAN> </SPAN></P><P><A href="https://pages.community.sap.com/topics/graph" target="_blank" rel="noopener noreferrer"><SPAN>Learn more about Graph in the SAP Community</SPAN></A><SPAN> </SPAN></P><P><SPAN> </SPAN></P>2024-02-23T09:38:54.537000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/graph-intro-series-part-4-hello-graph-write-your-first-graph-application/ba-p/13620393Graph intro series, part 4: Hello Graph! Write your first Graph application2024-02-28T10:16:21.965000+01:00shardulsonarhttps://community.sap.com/t5/user/viewprofilepage/user-id/159141<P class="lia-align-justify" style="text-align : justify;">This is the first of the end-to-end implementation blog series for Graph that focuses on a developer writing an extension application that uses the single, unified API of Graph in SAP Integration Suite. Please refer to <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-tutorial-part-1-introduction-to-graph-in-sap-integration-suite/ba-p/13615255" target="_self">Part 1</A> of this series for an introduction to Graph and to the <A href="https://community.sap.com/t5/technology-blogs-by-sap/information-map-multi-part-tutorial-graph-in-sap-integration-suite/ba-p/13614448" target="_self">Information Map</A> for an introduction to the entire series.</P><P class="lia-align-justify" style="text-align : justify;">The initial developer parts in this series will lead you through building the rudimentary basics of a classical enterprise extension web app: a list-details-navigate application in the <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-5-use-graph-securely-with-real-data-authentication/ba-p/13622195" target="_self">next part</A>. This is what it will look like:</P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Picture 1.png" style="width: 722px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/71905iEDF835C79461B9D9/image-dimensions/722x240?v=v2" width="722" height="240" role="button" title="Picture 1.png" alt="Picture 1.png" /></span></P><P class="lia-align-justify" style="text-align : justify;">Here, in this part, our goal is to establish the basic hello world programming essentials. This implementation requires no prior knowledge – we will teach you everything you need to know to become a proficient Graph developer. To test that everything works, we will re-use the Graph server that was configured as an SAP Business Accelerator Hub sandbox, and that we used in <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-tutorial-part-1-introduction-to-graph-in-sap-integration-suite/ba-p/13615255" target="_self">Part 1</A>.</P><H2 id="toc-hId-987847579">Getting Started: Node.js and NPM</H2><P class="lia-align-justify" style="text-align : justify;">We will use <STRONG>node.js</STRONG> (v20.11.1) and <STRONG>npm </STRONG>(version 10.2.4) to build this application and to keep it extremely simple, we will use the express web framework. Not familiar with node.js and express? I recommend <A title="Mozilla Developer Network - Introduction to Express JS " href="https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/Introduction" target="_blank" rel="noopener nofollow noreferrer">this</A> article on the Mozilla Developer Network (MDN) website. This article also explains how to easily set up a Node development environment, whether you use Windows, MacOS, or Linux.</P><P class="lia-align-justify" style="text-align : justify;">If you prefer to develop applications in the cloud directly from your browser, SAP offers a great cloud-based development experience alternative in the form of the SAP Build. Follow this link for more details on getting your instance. The rest of this blog assumes that you installed node.js and npm on your computer.</P><H2 id="toc-hId-791334074"><STRONG><FONT face="courier new,courier">package.json</FONT></STRONG></H2><P class="lia-align-justify" style="text-align : justify;">Select a folder (directory) where you want to develop your application. In this folder, create a small file called <FONT face="courier new,courier"><STRONG>package.json</STRONG></FONT>, with the following content:</P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code>{
"name": "hello-graph",
"version": "0.0.0",
"private": true,
"type": "module",
"scripts" : {
"start": "node src/hellograph.js"
},
"dependencies": {
"express": "4.18.1",
"node-fetch": "3.3.2",
"universal-cookie": "7.1.0"
}
}</code></pre><P> </P><P> </P><P> </P><P class="lia-align-justify" style="text-align : justify;"><FONT face="arial,helvetica,sans-serif">Note: For the latest version of these libraries please refer to <A href="https://www.npmjs.com/" target="_blank" rel="noopener nofollow noreferrer">https://www.npmjs.com/</A> </FONT></P><P class="lia-align-justify" style="text-align : justify;">After saving the file, run the following command on your console:</P><PRE><FONT face="arial,helvetica,sans-serif">npm install</FONT></PRE><P class="lia-align-justify" style="text-align : justify;">If your node.js environment was properly set up, then this command will install a few standard library packages in a new sub-folder called <FONT face="arial,helvetica,sans-serif"><STRONG><FONT face="courier new,courier">node_modules</FONT></STRONG>.<BR /></FONT>Now, create another sub-folder, next to <FONT face="arial,helvetica,sans-serif"><STRONG><FONT face="courier new,courier">node_modules</FONT></STRONG></FONT>, called <FONT face="arial,helvetica,sans-serif"><STRONG><FONT face="courier new,courier">src</FONT></STRONG></FONT>. This is where we will develop our code.</P><H2 id="toc-hId-594820569"><STRONG><FONT face="courier new,courier">graph.js</FONT></STRONG></H2><P class="lia-align-justify" style="text-align : justify;">First, we will create a boilerplate file in the <STRONG><FONT face="courier new,courier">src</FONT></STRONG> folder, called <STRONG><FONT face="courier new,courier">graph.js</FONT></STRONG>. This file will serve as a foundational template that you'll reuse, with a few small changes, across all future Graph implementation blogs and your projects. This file will contain a class called Graph, which provides a nice wrapper for using Graph. At this time, we will show how to read data, using a <STRONG><FONT face="courier new,courier">get()</FONT></STRONG> function.</P><P class="lia-align-justify" style="text-align : justify;">Copy and paste the code below into the file, then save it. This straightforward snippet utilizes the node-fetch package for simplicity.</P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code>import fetch from "node-fetch";
export default class Graph {
async get(entity, params) {
const url = `https://sandbox.api.sap.com/sapgraph/${entity}${params ? `?${params}` : ""}`;
console.log(url) //for debugging
const options = {
method: "get",
headers:{
"Accept": "application/json",
"apiKey": "<your-api-key>" // TODO: Enter the actual key
}
};
const response = await fetch(url, options);
console.log(`${response.status} (${response.statusText})`) // for debugging
return await response.json();
}
}</code></pre><P> </P><P> </P><P> </P><P class="lia-align-justify" style="text-align : justify;">Please note that we hard-coded the Graph server that uses the SAP Business Accelerator Hub sandbox. This allows us to focus here on the data access API, without requiring you to configure a new Business Data Graph(BDG) and deal with all the complex aspects of security and authentication, which will be the subject of future blog series.<BR />Since we are accessing the sandbox landscape data via SAP Business Accelerator Hub, you will need to insert your API Key (a short string) into the code above. Where do you get this key? Simply log in to <A title="SAP API Hub" href="https://api.sap.com/settings" target="_self" rel="noopener noreferrer">https://api.sap.com/settings</A> and click on <STRONG>Show API Key</STRONG> to see and save it.</P><H2 id="toc-hId-398307064"><STRONG><FONT face="courier new,courier">hellograph.js</FONT></STRONG></H2><P class="lia-align-justify" style="text-align : justify;">Now we are ready to write our first, simple server-side application that uses Graph. Paste the following into a new file, called<STRONG><FONT face="courier new,courier"> hellograph.js</FONT></STRONG>, in the <FONT face="courier new,courier"><STRONG>src</STRONG></FONT> folder:</P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code>import express from 'express';
import Graph from './graph.js';
const app = express();
const port = 3004;
const graph = new Graph();
app.get('/sap*', async (req, res) => {
const response = await graph.get(`${req.url}`, "");
res.setHeader('Content-Type', 'application/json');
res.json(response);
app.listen(port, () => {
console.log(`Explore Graph at http://localhost:${port}`)
});</code></pre><P> </P><P> </P><P> </P><P class="lia-align-justify" style="text-align : justify;">As previously mentioned, our code uses a popular node.js package called express. On line 8, we define the action taken when our server-side app is called from a browser. Here, we simply take the URL that we received (<FONT face="courier new,courier"><STRONG>req.url</STRONG></FONT>) and pass it through to Graph. We then show the returned data from Graph as a raw result on the browser screen.</P><P class="lia-align-justify" style="text-align : justify;">Our server-side app is ready. To run it, use your terminal console to enter:</P><PRE>npm run start</PRE><P class="lia-align-justify" style="text-align : justify;">The console will show:</P><PRE>$ Explore Graph at http://localhost:3004 </PRE><P class="lia-align-justify" style="text-align : justify;">Now the fun begins. The application expects a well-formed query URL to function properly. Open a browser window or tab, and enter the following query URL:</P><PRE>http://localhost:3004/sap.graph/SalesQuote?$top=2</PRE><P class="lia-align-justify" style="text-align : justify;">The browser will invoke your application code, which will call Graph to fetch the data, and if all goes well, you will see the following output on your screen. </P><P class="lia-align-justify" style="text-align : justify;"><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2024-02-27_14-03-55.png" style="width: 746px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/71937i23F3BB1BE0551DA5/image-size/large?v=v2&px=999" role="button" title="2024-02-27_14-03-55.png" alt="2024-02-27_14-03-55.png" /></span></SPAN></P><P class="lia-align-justify" style="text-align : justify;">Note: if you get an unformatted result, you can install a JSON formatter in your browser. <BR />Our Hello Graph app is already pretty useful; we can use it to explore the business data graph, by trying out different OData queries. Note: to stop your app from running, simply kill it (e.g. press CTRL-C on your Linux terminal or Windows console).<BR />We will re-use this app as a skeleton in the <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-5-use-graph-securely-with-real-data-authentication/ba-p/13622195" target="_self">next part</A> of this series, where we will introduce authentication.</P><HR /><P class="lia-align-justify" style="text-align : justify;"><STRONG>Shardul Sonar</STRONG>, Developer – Graph in SAP Integration Suite</P><P class="lia-align-justify" style="text-align : justify;"><SPAN><A href="https://pages.community.sap.com/topics/graph" target="_blank" rel="noopener noreferrer">Learn more about Graph in the SAP Community</A></SPAN></P>2024-02-28T10:16:21.965000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/graph-intro-series-part-5-use-graph-securely-with-real-data-authentication/ba-p/13622195Graph intro series, part 5: Use Graph Securely with Real Data – Authentication2024-02-28T15:12:59.976000+01:00LeonidGunkohttps://community.sap.com/t5/user/viewprofilepage/user-id/1406385<P><SPAN>Here, in </SPAN><SPAN>this part</SPAN><SPAN> of this tutorial, we are going to build the rudimentary basics of a classical enterprise extension web app: a list-details-navigate application. Please refer to</SPAN> <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-tutorial-part-1-introduction-to-graph-in-sap-integration-suite/ba-p/13615255" target="_blank"><SPAN>Part 1</SPAN></A> <SPAN>of this tutorial for an introduction to Graph</SPAN><SPAN> in SAP Integration Suite</SPAN><SPAN>, </SPAN><SPAN>to the previous tutorial part</SPAN><SPAN> for an introduction to the programming interface of Graph, and to the</SPAN> <A href="https://community.sap.com/t5/technology-blogs-by-sap/information-map-multi-part-tutorial-graph-in-sap-integration-suite/ba-p/13614448" target="_blank"><SPAN>Information Map</SPAN></A><SPAN> for an introduction to the entire tutorial series.</SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>Business Data Graphs</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>In</SPAN><SPAN> the <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-4-hello-graph-write-your-first-graph-application/ba-p/13620393" target="_self">previous part</A></SPAN><SPAN>, we accessed data from a preconfigured Graph sandbox server via SAP </SPAN><SPAN>Business Accelerator Hub</SPAN><SPAN>. We even embedded this server URL into our code. Anybody with an API key can access the sandbox data, without any further authentication or authorization.</SPAN><SPAN> </SPAN></P><P><SPAN>Of course, this is not a secure way of accessing confidential business data. Therefore, in this part of the tutorial, we will access Graph securely, via the oAuth protocol. OAuth doesn’t share password data but instead uses </SPAN><I><SPAN>authorization tokens</SPAN></I><SPAN> to prove an identity between clients and services like Graph and supports Single Sign On. With oAuth, you effectively approve your browser to interact with Graph on your behalf without giving away your password.</SPAN><SPAN> </SPAN></P><P><SPAN>Graph is a multitenant service. Customer administrators use the SAP Business Technology Platform (BTP) to </SPAN><I><SPAN>subscribe to Graph</SPAN></I><I><SPAN> in SAP Integration Suite</SPAN></I><SPAN>, by configuring one or more </SPAN><STRONG><I><SPAN>business data graphs</SPAN></I></STRONG><SPAN>. We</SPAN> <SPAN>discuss this topic in more detail in a </SPAN><SPAN>separate part</SPAN><SPAN> of this tutorial, but </SPAN><SPAN>for this tutorial part it</SPAN><SPAN> is important to understand that the business data graph is the key to a specific </SPAN><I><SPAN>landscape</SPAN></I><SPAN> of customer systems. Most customers will configure multiple landscapes, for instance for development, staging and productive usage.</SPAN><SPAN> </SPAN></P><P><SPAN>Each Graph business data graph is unique with unique credentials, such as its URL, its business data graph identifier and various secrets/tokens.</SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>credentials.js</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>To programmatically access the data from a Graph business data graph, an application requires these credentials. How do you get them? A file containing them, </SPAN><STRONG><SPAN>credentials.json</SPAN></STRONG><SPAN>, is created during the process of setting up and configuring the business data graph. You receive this file and the business data graph identifier from the BTP administrator or key user who configured the specific business data graph you want to access.</SPAN><SPAN> </SPAN></P><P><SPAN>Save the credentials file in the </SPAN><STRONG><SPAN>src</SPAN></STRONG><SPAN> folder of your project (you can use the existing </SPAN><STRONG><SPAN>src </SPAN></STRONG><SPAN>folder in which we developed our very first </SPAN><I><SPAN>hello Graph</SPAN></I><SPAN> server-side application, or create a new source folder in your project, up to you).</SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>auth.js</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>In the same </SPAN><STRONG><SPAN>src </SPAN></STRONG><SPAN>folder, create a file called </SPAN><STRONG><SPAN>auth.js</SPAN></STRONG><SPAN>, paste in the following boilerplate (standard) code, and save:</SPAN><SPAN> </SPAN></P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code>import credentials from "./credentials.json" assert { type: "json" };
import fetch from "node-fetch";
import Cookies from "universal-cookie";
const CALLBACK_URI = "/myCallbackURI";
const CookieName = "SAPGraphHelloQuotesCookie";
export default class Auth {
constructor() {
this.clientId = credentials.uaa.clientid;
this.clientSecret = credentials.uaa.clientsecret;
this.authUrl = credentials.uaa.url;
}
getToken(req) {
const cookies = new Cookies(req.headers.cookie);
return cookies.get(CookieName);
}
async fetchToken(code, redirectUri) {
const params = new URLSearchParams();
params.set('client_id', this.clientId);
params.set('client_secret', this.clientSecret);
params.set('code', code);
params.set('redirect_uri', redirectUri);
params.set('grant_type', 'authorization_code');
const response = await fetch(`${this.authUrl}/oauth/token`, {
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json'
},
body: params
});
const json = await response.json();
return json.access_token;
}
getMiddleware() {
return async (req, res, next) => {
const redirectUri = `${req.protocol}://${req.get("host")}${CALLBACK_URI}`;
if (req.url.startsWith(CALLBACK_URI)) {
const code = req.query.code;
if (code) {
const token = await this.fetchToken(code, redirectUri);
res.cookie(CookieName, token, { maxAge: 1000 * 60 * 120, httpOnly: true, path: "/", });
}
res.redirect("/");
} else if (!this.getToken(req)) {
res.redirect(`${this.authUrl}/oauth/authorize?client_id=${encodeURIComponent(this.clientId)}&redirect_uri=${encodeURIComponent(redirectUri)}&response_type=code`);
} else {
next();
}
};
}
}</code></pre><P> </P><P> </P><P> </P><P><SPAN>As you can see, this boilerplate authentication code refers to several pieces of information which are extracted from the </SPAN><STRONG><SPAN>credentials.json</SPAN></STRONG><SPAN> file, and are used to log the user of your application in, using single sign on, according to the specifics of the business data graph. For the user’s convenience, it also saves the obtained access token as a cookie, so that it can be used until it expires.</SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>graph.js</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>We will re-use the Graph class that we saw in</SPAN><SPAN> the previous part </SPAN><SPAN>of this tutorial, but now that we are required to authenticate the user before we can use the business data graph, we need to make a few small changes. Copy the following text into </SPAN><STRONG><SPAN>graph.js</SPAN></STRONG><SPAN> and save.</SPAN><SPAN> </SPAN></P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code>import credentials from "./credentials.json" assert { type: "json" };
import fetch from "node-fetch";
const apiUrl = credentials.uri;
const dataGraphId = "v1"; // example, modify accordingly
export default class Graph {
constructor(auth) {
this.auth = auth;
this.apiUrl = apiUrl;
this.dataGraphId = dataGraphId;
}
async get(req, entity, params) {
const token = this.auth.getToken(req);
const url = `${this.apiUrl}/${this.dataGraphId}/${entity}${params ? `?${params}` : ""}`;
console.log(url) //for debugging
const options = {
method: "get",
headers: {
"Authorization": `Bearer ${token}`,
"Accept": "application/json"
}
};
const response = await fetch(url, options);
console.log(`${response.status} (${response.statusText})`) // for debugging
const json = await response.json();
return json;
}
}</code></pre><P> </P><P> </P><P> </P><P><SPAN>You can see that we made two small changes. The Graph URL is now determined from the credentials of the specific business data graph, and the authorization token, obtained during user authentication, is passed to Graph. You may have to modify the business data graph identifier string from “v1” in the above code, before saving the file.</SPAN><SPAN> </SPAN></P><P><STRONG><SPAN>helloQuotes.js</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>Now are we finally ready to build the rudimentary basics of a classical three-page enterprise extension web app: a </SPAN><I><SPAN>list-details-navigate application</SPAN></I><SPAN>. This is what it will eventually look like:</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="LeonidGunko_2-1709118113938.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/72583i865A28B78BD77ADD/image-size/medium?v=v2&px=400" role="button" title="LeonidGunko_2-1709118113938.png" alt="LeonidGunko_2-1709118113938.png" /></span></P><P><SPAN>Don’t expect fancy code, with all the necessary error and exception handling of a robust, production-ready application. Our goal is to show how easy it is to just create small business applications using</SPAN> <SPAN>Graph; we will discuss the finer aspects of robust Graph clients in another part of this tutorial.</SPAN><SPAN> </SPAN></P><P><SPAN>We will first establish the skeleton of our application, in a file we will call </SPAN><STRONG><SPAN>helloQuotes.js</SPAN></STRONG><SPAN>:</SPAN><SPAN> </SPAN></P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code>// Hello Quote - our first SAP Graph extension app
import express from 'express';
import Graph from './graph.js';
import Auth from './auth.js';
const app = express();
const port = 3003;
const auth = new Auth();
app.use(auth.getMiddleware());
const graph = new Graph(auth);
// ------------------ 1) get and display a list of SalesQuotes ------------------
// ------------------ 2) show one quote and its items ------------------
// ------------------ 3) navigate to the product details for all the items in the quote ------------------
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
});</code></pre><P> </P><P> </P><P> </P><P><SPAN>This code doesn’t do anything interesting. It basically logs in the user, using the standard authentication that we just discussed, and then listens on port 3003 for web (REST) requests. To make the code work, we need to install </SPAN><I><SPAN>request handlers</SPAN></I><SPAN>.</SPAN><SPAN> </SPAN></P><P><SPAN>Using the </SPAN><I><SPAN>express</SPAN></I><SPAN> framework, we now create three such handlers, corresponding to three different expected URLs:</SPAN><SPAN> </SPAN></P><OL><LI><SPAN>The root (/)</SPAN><SPAN> </SPAN></LI></OL><OL><LI><SPAN>Request for a quote: /quote/…</SPAN><SPAN> </SPAN></LI></OL><OL><LI><SPAN>Request for a quote’s product details: /quote… /product</SPAN><SPAN> </SPAN></LI></OL><P><SPAN>Here is the first request handler:</SPAN></P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code>// ------------------ 1) get and display a list of SalesQuotes ------------------
app.get('/', async (req, res) => {
const quotes = await graph.get(req, "sap.graph/SalesQuote", "$top=20");
const qlist = quotes.value.map(q => `(${q.netAmount} ${q.netAmountCurrency})`).join("");
res.send(` <h1>Hello Quotes</h1> ${qlist} `);
});</code></pre><P> </P><P> </P><P> </P><P><SPAN>The handler will be fired if the browser requests the root document (“/”). What does the code do? It fetches the first 20 quotes (</SPAN><STRONG><SPAN>sap.graph/SalesQuote</SPAN></STRONG><SPAN>), and then wraps the resulting information (date and total amount) in HTML, and returns it.</SPAN><SPAN> </SPAN></P><P><SPAN>Go ahead, paste this handler into the app skeleton, save, and run the server-side app on your terminal console as follows:</SPAN><SPAN> </SPAN></P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code>node helloQuotes.js </code></pre><P> </P><P> </P><P> </P><P><SPAN>Open a new browser tab and enter the URL </SPAN><I><SPAN><A href="http://localhost:3003" target="_blank" rel="noopener nofollow noreferrer">http://localhost:3003</A></SPAN></I><SPAN>. If all went well, you will now see a list of dates and corresponding amounts in the browser.</SPAN><SPAN> </SPAN></P><P><SPAN>That was nice, but not very interesting. To turn your app into an interesting list-details app, </SPAN><I><SPAN>modify</SPAN></I><SPAN> the </SPAN><STRONG><SPAN>qlist</SPAN></STRONG><SPAN> assignment above to introduce a </SPAN><I><SPAN>link</SPAN></I><SPAN>, as follows:</SPAN><SPAN> </SPAN></P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code>const qlist = quotes.value.map(q => `<p> <a href="/quote/${q.id}">${q.pricingDate} </a>
(${q.netAmount} ${q.netAmountCurrency}) </p>`).join(""); </code></pre><P> </P><P> </P><P> </P><P><SPAN>Now, when the user clicks on one of the quotes, your app will be called again, and this time the URL will match ‘</SPAN><STRONG><SPAN>/quote</SPAN></STRONG><SPAN>…’.</SPAN><SPAN> </SPAN></P><P><SPAN>Let us now also introduce our second and third handlers:</SPAN><SPAN> </SPAN></P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-javascript"><code>// ------------------ 2) show one quote and its items ------------------
app.get('/quote/:id', async (req, res) => {
const id = req.params.id;
const singleQuote = await graph.get(req, `sap.graph/SalesQuote/${id}`, "$expand=items&$select=items");
const allItemLinks = singleQuote.items.map(item => `<p><a href="/quote/${id}/item/${item.itemId}"><button>Product details for item ${item.itemId}: ${item.product}</button></a></p>`).join("");
res.send(`
<h1>SalesQuote - Detail</h1>
<h4><code>id: ${id}</code></h4>
${allItemLinks}
`);
});
// ------------------ 3) navigate to the product details for an item in the quote ------------------
app.get('/quote/:id/item/:itemId', async (req, res) => {
const id = req.params.id;
const itemId = req.params.itemId;
const product = await graph.get(req, `sap.graph/SalesQuote/${id}/items/${itemId}/_product`, "$expand=distributionChains");
res.send(`
<h1>Product Detail</h1>
<h4><code>For SalesQuote ${id} and item ${itemId}</code></h4>
<pre><code>${JSON.stringify(product, null, 2)}</code></pre>
`);
});</code></pre><P> </P><P> </P><P> </P><P><SPAN>The OData query at the heart of the second handler uses the </SPAN><STRONG><SPAN>$expand</SPAN></STRONG><SPAN> query parameter to fetch the details of the quote, including what was quoted (items). The product id in the quote is then used in the third handler to </SPAN><I><SPAN>navigate </SPAN></I><SPAN>across the business graph, to fetch the detailed product information from the product catalog. In both cases, the data is just dumped to the screen as JSON, but evidently, a real app would format the information much more nicely.</SPAN><SPAN> </SPAN></P><P><SPAN>Go ahead, make the change in the first handler, and then paste the second and third handlers in your code, save the file, restart the service, and refresh the </SPAN><STRONG><SPAN>localhost:3003 </SPAN></STRONG><SPAN>page in the browser. Voila! Your app is live.</SPAN><SPAN> </SPAN></P><P><SPAN>Note again, how you, as a developer, never had to ask yourself where the data came from. You just navigated from a quote object to a product object, without any effort. The landscape that you accessed via the configured business data graph may have managed quotes in SAP Sales Cloud, or in SAP S/4HANA, and the product catalog may have been, theoretically, in yet another system. You simply don’t have to care.</SPAN><SPAN> </SPAN></P><P><SPAN> </SPAN></P><P><SPAN>————————————————————————————————————————— </SPAN></P><P><SPAN>Leonid Gunko, Developer – Graph in SAP Integration Suite</SPAN><SPAN> </SPAN></P><P><A href="https://pages.community.sap.com/topics/graph" target="_blank" rel="noopener noreferrer"><SPAN>Learn more about Graph in the SAP Community</SPAN></A><SPAN> </SPAN></P><P> </P>2024-02-28T15:12:59.976000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/api-composition-with-graph-customizing-your-business-data-graphs-with-model/ba-p/13639447API Composition with Graph: customizing your Business Data Graphs with Model Extensions2024-03-15T13:43:13.362000+01:00florian_moritzhttps://community.sap.com/t5/user/viewprofilepage/user-id/748729<P>Hello!</P><P>in this part of the tutorial series we will have a look at how to use Graph for composing APIs and customizing business data graphs with model extensions. <SPAN>We will walk through an example of how to create a custom entity with a custom association.</SPAN></P><P>For an overview of other parts of this series, check out the<SPAN> </SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/information-map-end-to-end-tutorial-graph-in-sap-integration-suite/ba-p/13614448" target="_blank">Information Map.</A> </P><P>---</P><P>API Composition helps organizations to customize their API surface and combine multiple data sources into a single unified API. With Graph, as part of SAP Integration Suite, API administrators can create a single API using a customized connected graph data model either for their whole landscape or for specialized use cases.</P><P>API administrators can customize Business Data Graphs with the help of Model Extensions. These are packages that define several Custom Entities. All customizations in Graph are virtual: custom entity definitions are projections using mirrored entities as sources. Custom entities can have one or multiple source entities from possibly different data sources.</P><H2 id="toc-hId-989040029">Example Scenario</H2><P>In this blog we will walk through an example of composing and customizing an API from two separate services. An SAP S/4HANA Service and a service based on a custom CAP extension. Here is an overview of the example scenario:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="blog-example-scenario.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81313i146FE72CEEE3BD39/image-size/large?v=v2&px=999" role="button" title="blog-example-scenario.png" alt="blog-example-scenario.png" /></span><BR /><EM>Example scenario diagram</EM></P><P><SPAN>We will compose a </SPAN><FONT face="terminal,monaco" color="#800000">demo.FrequentFlyer</FONT><SPAN> Custom Entity out of two sources: the </SPAN><FONT face="terminal,monaco" size="3" color="#800000">sap.s4.A_BusinessPartner</FONT><SPAN> from an SAP S/4HANA data source and a </SPAN><FONT face="terminal,monaco" color="#800000">my.custom.LoyaltyAccount</FONT><SPAN> entity from a custom CAP Extension on BTP. In addition, we will model an association from the custom entity </SPAN><FONT face="terminal,monaco" color="#800000">demo.FrequentFlyer</FONT><SPAN> to the </SPAN><FONT face="terminal,monaco" color="#800000">my.custom.LoyaltyStatus</FONT><SPAN> mirrored entity from the custom CAP Extension.</SPAN></P><H2 id="toc-hId-792526524">Example Setup</H2><P><SPAN>In this example we will be using the SAP S/4HANA sandbox provided on SAP Business Accelerator Hub and a simple CAP Extension service which we will be deploying in Cloud Foundry. The following steps will guide you through the required setup.</SPAN></P><H3 id="toc-hId-725095738"><SPAN>(1) Setting up Graph and SAP Integration Suite</SPAN></H3><P><SPAN>First we need a BTP subaccount with an SAP Integration Suite instance with Graph activated. Follow the steps outlined in this previous <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-2-set-up-graph-in-sap-integration-suite/ba-p/13616727" target="_blank">blog post</A> if you have not done so already. As a result you have a running SAP Integration Suite instance with Graph.</SPAN></P><H3 id="toc-hId-528582233"><SPAN>(2) Setting up the SAP S/4HANA Sandbox Destination</SPAN></H3><P><SPAN>For demo data we will be using the SAP S/4HANA BusinessPartner sandbox service available on SAP Business Accelerator Hub. Create a destination named <FONT face="terminal,monaco" color="#800000">demo-s4-bupa</FONT> in your BTP subaccount for this service with the following URL:</SPAN></P><P> </P><pre class="lia-code-sample language-bash"><code>https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata/sap/API_BUSINESS_PARTNER</code></pre><P> </P><P><SPAN>You will also have to configure an API key for sandbox access as described in this previous <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-2-set-up-graph-in-sap-integration-suite/ba-p/13616727" target="_blank">blog post</A>.</SPAN></P><H3 id="toc-hId-332068728"><SPAN>(3) Setting up the demo CAP Extension Service Destination</SPAN></H3><P>For the custom extension service, we will be deploying a small CAP-service in Cloud Foundry for demo purposes. We prepared this service<SPAN> </SPAN><A href="https://github.com/SAP-samples/graph-example-apps/tree/main/blog-series/API-composition/graph-demo-service" target="_blank" rel="nofollow noopener noreferrer">here</A>. Note that this example is only for demo puposes and would not fulfill requirements for any productive use cases.</P><P>To deploy the example CAP-service, make sure your BTP subaccount has the Cloud Foundry runtime enabled and a Cloud Foundry space exists (see also this<SPAN> </SPAN><A href="https://developers.sap.com/tutorials/btp-app-prepare-btp.html" target="_blank" rel="noopener noreferrer">tutorial</A>). Note that this minimal demo service only serves a few example records and does not require a database.</P><P>Clone the example service repository and copy the contents of<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">.cdsrc.json.template</FONT><SPAN> </SPAN>to a new file<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">.cdsrc.json</FONT><SPAN> </SPAN>and add a password for the configured Basic Authentication. In this demo we use Basic Authentication, to learn more about authenticating against Graph see<SPAN> </SPAN><A href="https://help.sap.com/docs/graph/graph/authentication" target="_blank" rel="noopener noreferrer">here</A>.</P><P> </P><pre class="lia-code-sample language-bash"><code>git clone https://github.com/SAP-samples/graph-example-apps.git
cd graph-example-apps/blog-series/API-composition/graph-demo-service
cp .cdsrc.json.template .cdsrc.json</code></pre><P> </P><P><SPAN>Make sure you have installed the prerequisites (Node.js, CAP, MBT) listed <A href="https://github.com/SAP-samples/graph-example-apps/tree/main/blog-series/API-composition/graph-demo-service#prerequisites" target="_blank" rel="noopener nofollow noreferrer">here</A>. Then install and build the project:</SPAN></P><P> </P><pre class="lia-code-sample language-bash"><code>npm ci
npm run build</code></pre><P> </P><P><SPAN>Next, deploy the service, for example using the Cloud Foundry CLI (see also <A href="https://github.com/SAP-samples/graph-example-apps/tree/main/blog-series/API-composition/graph-demo-service#prerequisites" target="_blank" rel="noopener nofollow noreferrer">here</A>)</SPAN></P><P> </P><pre class="lia-code-sample language-bash"><code>cf login --sso
cf deploy gen/mta.tar</code></pre><P> </P><P>After the deployment is finished you can access the example Loyalty service under<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000"><CF-application-route-URL>/graph-demo/</FONT>.</P><P>Finally, we need to create a BTP destination for this service. In the BTP Cockpit under<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">Connectivity > Destinations</FONT><SPAN> </SPAN>create a new Destination<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">demo-loyalty</FONT><SPAN> </SPAN>with the following URL:<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000"><CF-application-route-URL>/graph-demo/</FONT><SPAN> </SPAN>(<FONT face="terminal,monaco" color="#800000"><CF-application-route-URL></FONT><SPAN> </SPAN>depends on your Cloud Foundry deployment). Select<SPAN> "</SPAN>BasicAuthentication"<SPAN> </SPAN>for Authentication and add the user name and password you previously configured.</P><H3 id="toc-hId-135555223"><SPAN>(4) Preparing a Business Data Graph for the Example Scenario</SPAN></H3><P><SPAN>Now that we have created two destinations with our demo services, we can create a business data graph which we will extend with a model extension in the next section. In SAP Integration Suite open </SPAN><FONT face="terminal,monaco" color="#800000">Design > Graph</FONT><SPAN> and create a new business data graph </SPAN><FONT face="terminal,monaco" color="#800000">demo-bdg</FONT><SPAN>. Select the two destinations </SPAN><FONT face="terminal,monaco" color="#800000">demo-s4-bupa</FONT><SPAN> and </SPAN><FONT face="terminal,monaco" color="#800000">demo-loyalty</FONT><SPAN>. Leave the model extension input empty for now, this is what we are about to create. Activate the BDG in the final step. By default, Graph will use the namespace </SPAN><FONT face="terminal,monaco" color="#800000">my.custom</FONT><SPAN> for destinations with services of unknown type, such as </SPAN><FONT face="terminal,monaco" color="#800000">demo-loyalty</FONT><SPAN> in this case. When the business data graph is active we can start to model an extension for it.</SPAN></P><H2 id="toc-hId--190041001">Custom Entity Modeling</H2><P>Graph allows to customize business data graphs with model extensions. A model extension is a package that contains one or more custom entity definitions. To customize a business data graph, we create a new model extension for it and then add it to the BDG configuration.</P><P>Start in SAP Integration Suite under<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">Design > Graph</FONT><SPAN> </SPAN>and open the Model Extensions tab. Create a new model extension called<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">demo-extension</FONT><SPAN> </SPAN>and select the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">demo-bdg</FONT><SPAN> </SPAN>as modeling metadata BDG (this is only for retrieving metadata while modeling, the extension itself is independent).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81321iB0E1AF8F4E1451C1/image-size/large?v=v2&px=999" role="button" title="1.jpeg" alt="1.jpeg" /></span><BR /><EM>No Model Extensions exist</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81322i76D164DF78EC3A34/image-size/large?v=v2&px=999" role="button" title="2.jpeg" alt="2.jpeg" /></span><BR /><EM>Create a new Model Extension dialog</EM></P><H3 id="toc-hId--257471787"> </H3><H3 id="toc-hId--453985292">Creating a Custom Entity</H3><P>We will now create our custom entity<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">demo.FrequentFlyer</FONT><SPAN> </SPAN>by composing it from two source entities. In the dialog select<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">sap.s4.A_BusinessPartner</FONT><SPAN> </SPAN>as the main source entity. This is the entity that defines the identity of data-objects and is the source of the primary key for our custom entity. Then add<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">my.custom.LoyaltyAccount</FONT><SPAN> </SPAN>as an additional source entity. Here, we need to define the join condition that defines how data objects from both entities are matched. For that we select which attributes from both entities are matching. When the complete primary key of the additional source attribute is matched, Graph infers that there exists a cardinality-relationship of 0 or 1 between the data objects of both entities, as is the case in our example.</P><P>In the other case where only a partial primary key is matched, a many-cardinality will be assumed. In that case, for each data object of the main source entity there could be any number of additional source data objects. Graph will treat that case as a composition, where an entity contains an array of sub-entities.</P><P>With the source entities defined, we continue by selecting which attributes of each source we want to project into our custom entity<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">demo.FrequentFlyer</FONT>. Here, we select the primary key attribute<SPAN> <FONT face="terminal,monaco" color="#800000">BusinessPartner</FONT> </SPAN>of our main source entity in addition to other attributes from both sources (see below). Graph will suggest new names according to the Graph attribute naming<SPAN> </SPAN><A href="https://help.sap.com/docs/graph/graph/attributes" target="_blank" rel="noopener noreferrer">best practices</A>. Having selected some attributes we finalize the dialog via<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">Create</FONT>. We can then open our newly created custom entity and continue modeling the details.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="3.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81326i7ED76BD47AB3DC38/image-size/large?v=v2&px=999" role="button" title="3.jpeg" alt="3.jpeg" /></span><BR /><EM>Empty Model Extension</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="4.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81328i64F7DB6DAA745E02/image-size/large?v=v2&px=999" role="button" title="4.jpeg" alt="4.jpeg" /></span><BR /><EM>Custom Entity creation dialog</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="6.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81331i56029FF975BCCF54/image-size/large?v=v2&px=999" role="button" title="6.jpeg" alt="6.jpeg" /></span><BR /><EM>Source entities definition step</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="5.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81333i5132DD80F26D429A/image-size/large?v=v2&px=999" role="button" title="5.jpeg" alt="5.jpeg" /></span><BR /><EM>Additional source entity definition</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="7.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81336i09CADC6F825A8457/image-size/large?v=v2&px=999" role="button" title="7.jpeg" alt="7.jpeg" /></span><BR /><EM>Main source attribute selection</EM></P><P><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="8.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81338iC20DFE3F0F7254C4/image-size/large?v=v2&px=999" role="button" title="8.jpeg" alt="8.jpeg" /></span><BR />Additional source attribute selection</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="9.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81341i0553B66CD2E4B3B9/image-size/large?v=v2&px=999" role="button" title="9.jpeg" alt="9.jpeg" /></span><BR /><EM>Model Extension with the newly created Custom Entity</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="10.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81344iE07990B6C7871877/image-size/large?v=v2&px=999" role="button" title="10.jpeg" alt="10.jpeg" /></span><BR /><EM>Custom Entity attributes</EM></P><P> </P><H3 id="toc-hId--650498797">Applying Transform Functions</H3><P>When defining custom entities, graph allows to apply<SPAN> </SPAN><A href="https://help.sap.com/docs/graph/graph/transform-functions?locale=en-US" target="_blank" rel="noopener noreferrer">transform functions</A><SPAN> </SPAN>as part of the definition. When adding attributes from a source entity to the custom entity this is plainly called a<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">rename</FONT><SPAN> </SPAN>transform (as was done in the entity creation dialog).</P><P>In our example, we want to change our data model and invert the boolean source attribute<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">isMarkedForArchiving</FONT>, which denotes whether an object was archived, and instead call the inverse<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">isActive</FONT>. For that we use the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">negation</FONT><SPAN> </SPAN>transform. We select the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">isMarkedForArchiving</FONT><SPAN> </SPAN>attribute and change the transform in the right-side panel to<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">negation</FONT>, rename the attribute and apply our changes.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="11.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81347iFC1050D805CBE21A/image-size/large?v=v2&px=999" role="button" title="11.jpeg" alt="11.jpeg" /></span><BR /><EM>Details of the applied negation transform</EM></P><P> </P><H3 id="toc-hId--922243671">Adding a new Association</H3><P>Graph allows to customize the graph structure of a business data graph with the help of custom associations in custom entities. For example, foreign-key relationships that are present in mirrored entities, can be converted into semantic associations between custom entities.</P><P>In our example, the additional source entity<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">my.custom.LoyaltyAccount</FONT><SPAN> </SPAN>has an atttribute<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">loyaltyProgramStatusId</FONT><SPAN> </SPAN>that references<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">my.custom.LoyaltyStatus</FONT><SPAN> </SPAN>data objects by their ID. We turn this foreign-key relationship into an association as follows: in the dialog under<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">Add > Association</FONT><SPAN> </SPAN>select the type of association. Here, it is a to-one association, as each LoyaltyAccount references only one LoyaltyStatus via ID.</P><P>Next, select the target of the association:<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">my.custom.LoyaltyStatus</FONT>. Graph will suggest a name according to the Graph modeling best practices.</P><P>Then define how these two entities are related by matching attributes from the source entity (foreign key) to the primary key attributes of the target entity. In our example we only map the LoyaltyAccount attribute<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">loyaltyProgramStatusId</FONT><SPAN> </SPAN>to the single LoyaltyStatus key attribute<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">statusId</FONT><SPAN> </SPAN>and then add the association to the custom entity.</P><P>This completes our example. Now we can apply the changes to our custom entity and save the extension.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="12.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81354i0FE410AA74083300/image-size/large?v=v2&px=999" role="button" title="12.jpeg" alt="12.jpeg" /></span><EM>Add Association dialog</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="13.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81355iCE955A88D51F6B45/image-size/large?v=v2&px=999" role="button" title="13.jpeg" alt="13.jpeg" /></span><BR /><EM>Complete demo.FrequentFlyer Custom Entity definition</EM></P><H2 id="toc-hId--825354169"> </H2><H2 id="toc-hId--1021867674">Applying the Model Extension to the Business Data Graph</H2><P><SPAN>Now that we have created a model extension for our example scenario with the <FONT face="terminal,monaco" color="#800000">demo.FrequentFlyer</FONT> </SPAN><SPAN>custom entity we want to see it in action. For that we will apply the model extension to a BDG.</SPAN></P><H3 id="toc-hId--1511784186">Creating new BDGs with Model Extensions</H3><P>With an existing model extension, we can simply create a new BDG and select the extension during the BDG-creation dialog. Graph will then generate a BDG configuration with locating policy rules for all custom entities.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="14.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81356iD3285069E147A252/image-size/large?v=v2&px=999" role="button" title="14.jpeg" alt="14.jpeg" /></span><BR /><EM>Selecting an existing Model Extension during BDG creation</EM></P><H3 id="toc-hId--1708297691">Adding Model Extensions to existing BDGs</H3><P>Alternatively, we can also manually add a model extension to an existing BDG. Here we need to add the name of the extension to the top-level <FONT face="terminal,monaco" color="#800000">extensions</FONT> array (see below), and add locating policy rules for all custom entities.</P><P> </P><pre class="lia-code-sample language-json"><code>"extensions": [
"demo-extension"
],</code></pre><P> </P><P><EM>BDG configuration extensions snippet</EM></P><P>In our example we add a single custom entity that is based on two source entities which requires two entries in the BDG locating policy rules, one for each source entity (see also<SPAN> </SPAN><A href="https://help.sap.com/docs/graph/graph/business-data-graph-configuration-file?version=PROD#locating-policy" target="_blank" rel="noopener noreferrer">here</A>). Add the following snippet to the BDG configuration under <FONT face="terminal,monaco" color="#800000">locatingPolicy.rules</FONT> (adapt the name of the leading data sources to match the ones in your BDG).</P><P> </P><pre class="lia-code-sample language-json"><code>{
"name": "demo.FrequentFlyer",
"leading": "s4",
"local": []
},
{
"name": "demo.FrequentFlyer",
"leading": "my.custom",
"local": [],
"sourceEntity": "my.custom.LoyaltyAccount"
}</code></pre><P> </P><P><EM>BDG configuration <FONT face="terminal,monaco" color="#800000">locatingPolicy.rules</FONT> snippet</EM></P><P> </P><DIV class=""><SPAN>Finally, we activate the BDG with the included model extension to try it out. Once the BDG was updated we can open the Graph Navigator in SAP API Business Hub Enterprise (see also this </SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-3-construct-and-explore-a-business-data-graph/ba-p/13616707" target="_blank">blog</A><SPAN>). There we can see that our updated </SPAN><FONT face="terminal,monaco" color="#800000">demo-bdg</FONT><SPAN> now has a </SPAN><FONT face="terminal,monaco" color="#800000">demo.FrequentFlyer</FONT><SPAN> entity with the schema we previously modeled. In the "<EM>Try Out"</EM> we can also see that we can follow the new </SPAN><FONT face="terminal,monaco" color="#800000">_loyaltyStatus</FONT><SPAN> association via </SPAN><FONT face="terminal,monaco" color="#800000">$expand</FONT><SPAN><SPAN> or semantic navigation.</SPAN></SPAN></DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="navigator-schema.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81377i44F9BB50F6E17494/image-size/large?v=v2&px=999" role="button" title="navigator-schema.jpeg" alt="navigator-schema.jpeg" /></span><BR /><EM>Custom Entity schema in Graph Navigator</EM></DIV><DIV class=""> </DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="navigator-tryout.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81376iD99BE35A6600FCB9/image-size/large?v=v2&px=999" role="button" title="navigator-tryout.jpeg" alt="navigator-tryout.jpeg" /></span><BR /><P><EM>Custom Entity Try Out in Graph Navigator</EM></P><H2 id="toc-hId--1611408189"> </H2><H2 id="toc-hId--1807921694">Summary</H2><P>This small blog example illustrates how Graph can be used to compose APIs and customize the API surface with the help of a business data graph.</P><P>We used Graph to compose two different service APIs into a single connected business data graph: an SAP S/4HANA service and a custom CAP-extension service. We created a model extension containing a custom entity <FONT face="terminal,monaco" color="#800000">demo.FrequentFlyer</FONT> with a custom association to another entity and a negation transform function.</P><P>To learn more about the full Graph modeling capabilities find the documentation<SPAN> </SPAN><A href="https://help.sap.com/docs/graph/graph/model" target="_blank" rel="noopener noreferrer">here</A><SPAN> </SPAN>with more infomation on modeling topics such as all supported transform functions, creating compositions and adding to-many associations to your model.</P><P> </P><H3 id="toc-hId-1997129090">Reference Materials</H3><P>Find the full BDG configuration JSON and custom entity definition JSON files used in the example demo below.<BR /><STRONG>Custom Entity definition JSON file:</STRONG></P></DIV><P> </P><pre class="lia-code-sample language-json"><code>{
"entity": "demo.FrequentFlyer",
"version": "1.0.0",
"sourceEntities": [
{
"name": "sap.s4.A_BusinessPartner"
},
{
"name": "my.custom.LoyaltyAccount",
"join": [["BusinessPartner", "userId"]]
}
],
"attributes": [
{
"name": "id",
"source": ["BusinessPartner"],
"key": true
},
{
"name": "businessPartnerFullName",
"source": ["BusinessPartnerFullName"]
},
{
"name": "loyaltyProgramName",
"source": ["loyaltyProgramName"],
"sourceEntity": "my.custom.LoyaltyAccount"
},
{
"name": "loyaltyPoints",
"source": ["loyaltyPoints"],
"sourceEntity": "my.custom.LoyaltyAccount"
},
{
"name": "isActive",
"source": ["isMarkedForArchiving"],
"sourceEntity": "my.custom.LoyaltyAccount",
"transform": "negation",
"type": "Boolean"
},
{
"name": "_loyaltyStatus",
"type": "Association",
"associationTarget": "my.custom.LoyaltyStatus"
},
{
"name": "_loyaltyStatus.statusId",
"source": ["loyaltyProgramStatusId"],
"sourceEntity": "my.custom.LoyaltyAccount"
}
],
"annotations": {
"description": "",
"readonly": false
}
}</code></pre><P> </P><P><STRONG>BDG configuration JSON:</STRONG></P><P> </P><pre class="lia-code-sample language-json"><code>{
"businessDataGraphIdentifier": "demo-bdg",
"graphModelVersion": "^v3",
"schemaVersion": "1.2.1",
"dataSources": [
{
"name": "my.custom",
"services": [
{
"destinationName": "demo-loyalty",
"path": ""
}
],
"namespace": "my.custom"
},
{
"name": "s4",
"services": [
{
"destinationName": "demo-s4-bupa",
"path": ""
}
],
"namespace": null
}
],
"locatingPolicy": {
"cues": [],
"rules": [
{
"name": "sap.s4.*",
"leading": "s4",
"local": [],
"cues": [],
"sourceEntity": null
},
{
"name": "sap.graph.*",
"leading": "s4",
"local": [],
"cues": [],
"sourceEntity": null
},
{
"name": "my.custom.*",
"leading": "my.custom",
"local": [],
"cues": [],
"sourceEntity": null
},
{
"name": "demo.FrequentFlyer",
"leading": "s4",
"local": [],
"cues": [],
"sourceEntity": null
},
{
"name": "demo.FrequentFlyer",
"leading": "my.custom",
"local": [],
"sourceEntity": "my.custom.LoyaltyAccount",
"cues": []
}
],
"description": "",
"keyMapping": []
},
"effectiveGraphModelVersion": "3.1.0",
"description": "",
"exclude": [],
"extensions": ["demo-extension"]
}</code></pre><P> </P><P>---</P><P><STRONG>Florian Moritz</STRONG></P>2024-03-15T13:43:13.362000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/graph-intro-series-part-9-use-graph-with-graphql/ba-p/13623717Graph intro series, part 9: Use Graph With GraphQL2024-03-17T04:30:00.031000+01:00AlexHofferthttps://community.sap.com/t5/user/viewprofilepage/user-id/707350<H2 id="toc-hId-987940552">GraphQL</H2><P><SPAN><A href="https://graphql.org/" target="_blank" rel="noopener nofollow noreferrer">GraphQL</A> is a query language for APIs that provides a type system to describe the data model in a structured way. It provides a strongly typed schema to describe the data model of an API in a structured way. Additionally, clients of an API use the query language to describe the data they want to request. GraphQL is similar to OData because they both provide a structured, typed schema for APIs and also enable clients to write powerful queries to request exactly the data they need using a single request.</SPAN></P><P><SPAN>The GraphQL adapter builds on the same metadata as the OData adapter.</SPAN></P><H2 id="toc-hId-791427047">Tutorial Setup</H2><P><SPAN>To keep things simple, we will be using the Graph sandbox endpoint. All you need to use this endpoint is your favorite GraphQL tool, for example the Altair GraphQL client, and your API key from SAP API Hub. To retrieve your API key, log into </SPAN><A href="https://api.sap.com/" target="_blank" rel="noopener noreferrer">SAP API Business Hub</A><SPAN>, go to </SPAN><A href="https://api.sap.com/settings" target="_blank" rel="noopener noreferrer">settings</A><SPAN> and copy your API key from the </SPAN><STRONG><SPAN>Show API Key</SPAN></STRONG><SPAN> button.</SPAN></P><P><SPAN>To make requests against the Graph sandbox, add your API key as an HTTP header in your requests: apiKey: <your API key>. Then you can use the Graph sandbox through the following endpoint:</SPAN></P><P> </P><pre class="lia-code-sample language-markup"><code>https://sandbox.api.sap.com/sapgraph/graphql</code></pre><P> </P><H4 id="toc-hId-853078980"><SPAN>Tutorial Specific Settings</SPAN></H4><P><SPAN>Usually, GraphQL requests are done using </SPAN><FONT color="#008080"><STRONG>POST </STRONG></FONT><SPAN>requests. But, the sandbox is limited to </SPAN><FONT color="#008080"><STRONG>GET</STRONG></FONT><SPAN> requests, so we need to do </SPAN><FONT color="#008080"><STRONG>GET</STRONG></FONT><SPAN> requests for this tutorial. For most GraphQL clients this is just a setting and we are not creating too large request. A productive Graph instance is able to receive <FONT color="#008080"><STRONG>POST</STRONG></FONT> requests.</SPAN></P><P>The API key is just used for the purposes of this sandbox endpoint and not relevant in the context of requests to productive Graph instances.</P><P>Also note that the URL of the Graph sandbox differs from the a productive URL of Graph.</P><H2 id="toc-hId-398400037"><SPAN>Exploring the Schema</SPAN></H2><P>Every GraphQL service defines a <A href="https://graphql.org/learn/schema/" target="_self" rel="nofollow noopener noreferrer">schema</A> that completely describes the set of types you can use for querying that service. GraphQL allows asking <SPAN>about what queries it supports using the <A href="https://graphql.org/learn/introspection/" target="_self" rel="nofollow noopener noreferrer">introspection system</A>. </SPAN></P><P><SPAN>Most GraphQL clients automatically load and scan the complete schema automatically, so you might not need to do that on your own and use the client to explore the schema.</SPAN></P><P><SPAN>To see what types are available, you can query the <FONT color="#008080"><STRONG>__schema</STRONG></FONT> field:</SPAN></P><P> </P><pre class="lia-code-sample language-markup"><code>{
__schema {
types {
name
}
}
}</code></pre><P> </P><P>This will return all service specific and build-in types of the service:</P><P> </P><pre class="lia-code-sample language-json"><code>{
"data": {
"__schema": {
"types": [
{
"name": "Query"
},
{
"name": "sap_c4c"
},
{
"name": "sap_c4c_BusinessAttributeCollection_connection"
},
{
"name": "sap_c4c_BusinessAttributeCollection"
}
...
]
}
}
}</code></pre><P> </P><P>To get more information for a specific type, you can either extend the query above or do a separate query for the <FONT color="#008080"><STRONG>__type</STRONG></FONT> field. If you introspect the <FONT color="#008080"><STRONG>Query </STRONG></FONT>with</P><P> </P><pre class="lia-code-sample language-markup"><code>{
__type(name: "Query"){
name
fields {
name
}
}
}</code></pre><P> </P><P>you get all namespaces. These include Graph's build-in namespaces as well as user-defined custom namespaces for custom entities.</P><P> </P><pre class="lia-code-sample language-json"><code>{
"data": {
"__type": {
"name": "Query",
"fields": [
{ "name": "sap_c4c" },
{ "name": "sap_graph" },
{ "name": "sap_hcm" },
{ "name": "sap_s4 "}
]
}
}
}</code></pre><P> </P><P>You can use a similar query to get the list of entities in a namespace, by using the namespace instead <FONT color="#008080"><STRONG>"Query"</STRONG></FONT> as the name.</P><P>To get more information in a single request, you can extend the query, for example to get all fields of <FONT color="#008080"><STRONG>sap_graph_SalesQuote</STRONG></FONT> with their name and kind, you simply query this:</P><P> </P><pre class="lia-code-sample language-markup"><code>{
__type(name: "sap_graph_SalesQuote"){
name
fields {
name
type {
name
kind
}
}
}
}</code></pre><P> </P><P>returning all available properties of the <FONT color="#008080"><STRONG>sap_graph_SalesQuote</STRONG></FONT>:</P><P> </P><pre class="lia-code-sample language-json"><code>{
"data": {
"__type": {
"name": "sap_graph_SalesQuote",
"fields": [
{"name": "id", "type": {"name": "String", "kind": "SCALAR"}},
{"name": "createdAt", "type": {"name": "DateTime", "kind": "SCALAR"}},
{"name": "changedAt", "type": {"name": "DateTime", "kind": "SCALAR"}},
{"name": "displayId", "type": {"name": "String", "kind": "SCALAR"}},
{"name": "netAmount", "type": {"name": "Decimal", "kind": "SCALAR"}},
{"name": "quoteType", "type": {"name": "String", "kind": "SCALAR"}},
{"name": "soldToParty", "type": {"name": "String", "kind": "SCALAR"}},
{"name": "_soldToParty", "type": {"name": "sap_graph_SalesDocumentReason", "kind": "OBJECT"}},
{"name": "_soldToParty_id", "type": {"name": "String", "kind": "SCALAR"}},
{"name": "items", "type": {"name": "sap_graph_SalesQuote_items_connection", "kind": "OBJECT"}},
...
]
}
}
}</code></pre><P> </P><P><SPAN>We can see that a </SPAN><FONT color="#008080"><STRONG><SPAN>SalesQuote</SPAN></STRONG></FONT><SPAN> has several properties of different types, such as </SPAN><FONT color="#008080"><STRONG><SPAN>String</SPAN></STRONG></FONT><SPAN> or </SPAN><FONT color="#008080"><STRONG><SPAN>Decimal</SPAN></STRONG></FONT><SPAN>, but also more complex structured types like the </SPAN><FONT color="#008080"><STRONG><SPAN>items</SPAN></STRONG></FONT><SPAN> property, which is a collection of several <FONT color="#008080"><STRONG>sap_graph_SalesQuote_items</STRONG></FONT></SPAN><SPAN>, that are also defined in the same data model. The <FONT color="#008080"><STRONG>_connection</STRONG></FONT> types allow for retrieving data of entities of a to-many relation.</SPAN></P><P> </P><pre class="lia-code-sample language-json"><code>{
"data": {
"__type": {
"name": "sap_graph_SalesQuote_items_connection",
"fields": [
{"name": "nodes", "type": {"name": null, "kind": "LIST", "ofType": {"name": "sap_graph_SalesQuote_items"}}},
{"name": "totalCount", "type": {"name": "Int", "kind": "SCALAR", "ofType": null}}
]
}
}
}</code></pre><P> </P><H2 id="toc-hId-201886532"><SPAN>Simple Example</SPAN></H2><P><SPAN>Let us look at an example. We want to get a SalesQuote. For that, we create the following GraphQL request:</SPAN></P><P> </P><pre class="lia-code-sample language-markup"><code>{
sap_graph {
SalesQuote (top: 1){
nodes {
id
displayId
netAmount
}
}
}
}</code></pre><P> </P><P>In GraphQL, you always specify exactly what fields you would like to receive. In the example request above we selected the <FONT color="#008080"><STRONG>id</STRONG></FONT>, <FONT color="#008080"><STRONG>displayId</STRONG></FONT> and the <FONT color="#008080"><STRONG>netAmount</STRONG></FONT> of the <FONT color="#008080"><STRONG>SalesQuote. </STRONG><FONT color="#000000">To make the query fast and have an easy to read result, we have added <FONT color="#008080"><STRONG>(top: 1)</STRONG></FONT> to get only one SalesQuote.</FONT></FONT></P><P> </P><pre class="lia-code-sample language-json"><code>{
"data": {
"sap_graph": {
"SalesQuote": {
"nodes": [
{
"id": "c4c~1",
"displayId": "1",
"netAmount": "890"
}
]
}
}
}
}</code></pre><P> </P><H2 id="toc-hId-5373027">Example With Nesting</H2><P>We now want to get the items and the soldToParty of that SalesQuote as well, so we simply add these attributes to the query with the fields we would like to see.</P><P>Note that the attributes of the items attribute are encapsulated with <FONT color="#008080"><STRONG>nodes</STRONG></FONT> like it is done with the attributes of the SalesQuote as well. This has to be done for all list types. <FONT color="#008080"><STRONG>_soldToParty</STRONG></FONT> is a to-one association, so here the attributes are directly. The reason for this extra level is so that you can get the total amount of elements next to the actual elements of the list like here for the SalesQuote:</P><P> </P><pre class="lia-code-sample language-markup"><code>{
sap_graph {
SalesQuote (top: 1){
totalCount
nodes {
id
displayId
netAmount
_soldToParty {
id
name
}
items {
nodes {
itemId
itemText
product
quantity
}
}
}
}
}
}</code></pre><P> </P><P>This will result in the items of the <FONT color="#008080"><STRONG>SalesQuote</STRONG></FONT> and the associated <FONT color="#008080"><STRONG>soldToParty</STRONG></FONT> being returned. The total count of found <FONT color="#008080"><STRONG>SalesQuotes</STRONG></FONT> is now available as well:</P><P> </P><pre class="lia-code-sample language-json"><code>{
"data": {
"sap_graph": {
"SalesQuote": {
"totalCount": 135,
"nodes": [
{
"id": "c4c~1",
"displayId": "1",
"netAmount": "890",
"_soldToParty": {
"id": "c4c~10014",
"name": "System Tec"
},
"items": {
"nodes": [
{
"itemId": "10",
"itemText": "Green Emission Calculator",
"product": "P300100",
"quantity": "1"
}
]
}
}
]
}
}
}
}</code></pre><P> </P><H2 id="toc-hId--191140478">Working with collections: filtering, ordering and pagination</H2><P><SPAN>When working with collections of entities, we typically want to filter the entities by some criteria or arrange them in a specific order. In Graph's GraphQL schema this is supported via the </SPAN><FONT color="#008080"><STRONG><SPAN>filter</SPAN></STRONG></FONT><SPAN> and </SPAN><FONT color="#008080"><STRONG><SPAN>order</SPAN></STRONG></FONT><SPAN> arguments. </SPAN></P><P><SPAN>Let us continue with our example above. Say, we want to retrieve all <FONT color="#008080"><STRONG>SalesQuotes</STRONG></FONT> with a value greater than 100 U.S. Dollars. </SPAN><SPAN>The value condition can be formulated with the filter rule <FONT color="#008080"><STRONG>netAmount: {ge: 100}</STRONG></FONT>. For the currency condition we need to compare it with a string for equality: <FONT color="#008080"><STRONG>netAmountCurrency: {eq: "USD"}</STRONG></FONT>. Filter rules that are in one filter object are combined with logical conjunction (and). If you want to combine rules with logical disjunction (or), you would pass multiple filters as a list in the <FONT color="#008080"><STRONG>filter</STRONG></FONT> argument.</SPAN></P><P><SPAN>In addition, we define an ascending ordering on the <STRONG><FONT color="#008080">netAmount</FONT> </STRONG>property: <FONT color="#008080"><STRONG>orderBy: {netAmount: asc}</STRONG></FONT>.<BR /></SPAN></P><P><SPAN>With </SPAN><FONT color="#008080"><STRONG><SPAN>top</SPAN></STRONG></FONT><SPAN> and </SPAN><FONT color="#008080"><STRONG><SPAN>skip</SPAN></STRONG></FONT><SPAN> we can additionally define a sliding window over the result to implement pagination. <FONT color="#008080"><STRONG>top</STRONG></FONT> specifies how many result entities should be returned: the page size. How many result entities should be skipped from the beginning of the ordering is defined with the <FONT color="#008080"><STRONG>skip</STRONG></FONT> argument.</SPAN></P><P> </P><pre class="lia-code-sample language-markup"><code>{
sap_graph {
SalesQuote (
top: 5,
skip: 5,
orderBy: {netAmount: asc},
filter: {
netAmount: {ge: 100},
netAmountCurrency: {eq: "USD"}
}
){
totalCount
nodes {
id
netAmount
netAmountCurrency
}
}
}
}</code></pre><P> </P><H2 id="toc-hId--387653983">Summary</H2><P><SPAN>In this tutorial we had a look at using Graph with GraphQL. We covered all the features that you as a developer working with Graph need to know, like how to:</SPAN></P><UL><LI>inspect the schema and structure of the business data graph</LI><LI>formulate complex queries</LI><LI>work with collections</LI></UL><P><SPAN>GraphQL itself offers much more than what we showed in this tutorial. You can read more about it in the </SPAN><A href="https://graphql.org/learn/" target="_blank" rel="nofollow noopener noreferrer">the GraphQL documentation</A> and <A href="https://help.sap.com/docs/graph/graph/graphql" target="_blank" rel="noopener noreferrer">the Graph documentation</A> <SPAN>.</SPAN><BR /><BR /><SPAN>You as a developer now have a second data protocol option you can use with Graph. The structure of all entities in the business data graph is exactly the same as if you access Graph with the OData protocol. You have one API to retrieve data in one unified format, no matter the source system.</SPAN></P><P><SPAN>________________________________________________________________<BR /><STRONG>Alexander Hoffert, Senior Developer – Graph</STRONG></SPAN></P><P>Visit <A href="https://pages.community.sap.com/topics/graph" target="_self" rel="noreferrer noopener">Graph</A> on the SAP Community</P>2024-03-17T04:30:00.031000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/graph-intro-series-part-8-use-graph-with-odata-v4/ba-p/13641190Graph intro series, part 8: Use Graph With OData v42024-03-19T14:21:24.058000+01:00florian_moritzhttps://community.sap.com/t5/user/viewprofilepage/user-id/748729<P><EM>What you will learn: use OData v4 to fetch data and explore the structure of the connected data model exposed by Graph.</EM></P><P>Hello!</P><P>In this part of the tutorial on Graph we will focus on the OData protocol that Graph exposes and how to explore the structure of the data model of a business data graph. OData is one of the two data protocols supported by Graph - next to <A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-intro-series-part-9-use-graph-with-graphql/ba-p/13623717" target="_self">GraphQL</A>.</P><P><SPAN>For an overview of other parts of this series, check out the</SPAN><SPAN> </SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/information-map-end-to-end-tutorial-graph-in-sap-integration-suite/ba-p/13614448" target="_blank">Information Map.</A><SPAN> </SPAN></P><P>Graph is built on open standards and technologies. Clients can communicate with Graph using the<SPAN> </SPAN><A href="http://docs.oasis-open.org/odata/odata/v4.01/os/part1-protocol/odata-v4.01-os-part1-protocol.html" target="_blank" rel="nofollow noopener noreferrer">Open Data v4 Protocol</A><SPAN> </SPAN>(OData). This is a<SPAN> </SPAN><A href="https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=odata" target="_blank" rel="nofollow noopener noreferrer">standardized RESTful HTTP protocol</A><SPAN> </SPAN>with defined semantics that help promote interoperability between services.</P><P>OData is centered around resources (data entities), which are identified by URLs. In Graph, there are for example the Customer, Product, or SalesQuote entities. The structure of these entities is defined in an Entity Data Model (EDM) which can be inspected by clients. OData provides many operations to filter or search in entity collections, to navigate between associated entities and to adapt the response shape.</P><P>We will now look at examples on how to formulate OData requests for Graph.</P><H2 id="toc-hId-989722487"> </H2><H2 id="toc-hId-793208982">Tutorial Setup</H2><P>To keep things simple, we will be using the Graph sandbox business data graph (BDG). All you need to use it is your favorite HTTP tool, for example Postman, and your API key from<SPAN> </SPAN><A href="https://api.sap.com/" target="_blank" rel="noopener noreferrer">SAP Business Accelerator Hub</A>. To retrieve your API key, log into SAP Business Accelerator Hub, go to<SPAN> </SPAN><A href="https://api.sap.com/settings" target="_blank" rel="noopener noreferrer">settings</A><SPAN> </SPAN>and copy your API key from the Show API Key button.</P><P>To make requests against the Graph sandbox BDG, add your API key as an HTTP header in your requests:<BR /><FONT face="terminal,monaco" color="#800000">apiKey: <your API key></FONT></P><P>Then you can use the Graph sandbox BDG through the following endpoint:</P><P> </P><pre class="lia-code-sample language-javascript"><code>https://sandbox.api.sap.com/sapgraph/</code></pre><P> </P><DIV class=""><BLOCKQUOTE><P>Note: The API key is just used for the purposes of this sandbox endpoint and not relevant in the context of OData requests or productive Graph instances.</P></BLOCKQUOTE><H2 id="toc-hId-596695477">Exploring the OData data model</H2><P>OData defines an Entity Data Model that describes the structure of all known entities. This helps developers and clients alike to reason about the available entities and their structure. The data model and further metadata can be inspected through a special<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$metadata</FONT><SPAN> </SPAN>resource. Graph makes metadata available for each namespace, such as<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">sap.graph</FONT><SPAN> </SPAN>for the unified Graph data model.</P><P>To retrieve the metadata of the unified data model in Graph, make the following request, which will return an EDMX specification (an XML dialect for describing OData Entity Data Models).</P></DIV><P> </P><pre class="lia-code-sample language-yaml"><code>https://sandbox.api.sap.com/sapgraph/sap.graph/$metadata</code></pre><P> </P><P><SPAN>In the response, we can inspect the structure of all the entities (and sub-entities) that are described as EntityType entries as well as other metadata. Let's have a closer look at the definition of the SalesQuote entity type in this extract from the sales domain metadata:</SPAN></P><P> </P><pre class="lia-code-sample language-markup"><code><EntityType Name="SalesQuote">
<Key>
<PropertyRef Name="id"/>
</Key>
<Property Name="id" Type="Edm.String" MaxLength="82" Nullable="false"/>
<Property Name="displayId" Type="Edm.String"/>
<Property Name="netAmount" Type="Edm.Decimal" Scale="6" Precision="22"/>
<Property Name="pricingDate" Type="Edm.DateTimeOffset"/>
<Property Name="netAmountCurrency" Type="Edm.String" MaxLength="5"/>
<NavigationProperty Name="_netAmountCurrency" Type="sap.graph.Currency"/>
<NavigationProperty Name="items" Type="Collection(sap.graph.SalesQuote_items)" Partner="up_" ContainsTarget="true"/>
<Property Name="soldToParty" Type="Edm.String" MaxLength="10"/>
<NavigationProperty Name="_soldToParty" Type="sap.graph.Customer"/>
<NavigationProperty Name="_cxsales" Type="sap.cxsales.SalesQuoteCollection"/>
...
</EntityType></code></pre><P> </P><P>We can see that a SalesQuote has several properties of different types, such as String or Decimal, but also more complex structured types like the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">items</FONT><SPAN> </SPAN>property, which is a collection of several<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">sap.graph.SalesQuote_items</FONT>, that are also defined in the same data model. Furthermore, we see that the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">id</FONT><SPAN> </SPAN>property is referenced as key for this entity type. Navigation Properties allow for navigation to a related entity. The<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">items</FONT><SPAN> </SPAN>property is a navigation property because the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">sap.graph.SalesQuote_items</FONT><SPAN> </SPAN>is modeled as a separate entity type in the metadata.</P><P>Let's look at an example. Add the following query path to the sandbox endpoint to make the request. This will retrieve one SalesQuote entity (here we add<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$top=1</FONT><SPAN> </SPAN>to limit the result set to one entity):</P><P> </P><pre class="lia-code-sample language-yaml"><code>/sap.graph/SalesQuote?$top=1</code></pre><P> </P><P>From inspecting the metadata, we have learned that SalesQuotes have items, however when comparing with the response from the example, no items are included in the response.</P><P>The reason for this is that OData has a mechanism for the client to control which navigation properties are included as part of the response. This is called expanding a property. By default, Graph returns responses non-expanded if not specified by the client. In addition to expanding the response, OData also allows for restricting it to requested values only. We will have a look at these mechanisms next.</P><DIV class=""><H2 id="toc-hId-400181972">Expanding and restricting the response</H2><P>OData allows clients to adapt the response format in two ways. Clients can restrict the response to a set of specified properties via<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$select</FONT>. And they can expand the response by including referenced entities inline as part of the response via<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$expand</FONT>.</P><P>If we only require the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">netAmount</FONT><SPAN> </SPAN>of a SalesQuote, we can restrict the response by adding it to the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$select</FONT><SPAN> </SPAN>query parameter:</P></DIV><P> </P><pre class="lia-code-sample language-json"><code>/sap.graph/SalesQuote?$top=1&$select=netAmount</code></pre><P> </P><P>This will return only the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">netAmount</FONT><SPAN> </SPAN>property along with the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">id</FONT>, as it is the key attribute and therefore always included.</P><P>If we also require the items of a SalesQuote, we need to expand the response (as it is a navigation property) by adding it to the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$expand</FONT><SPAN> </SPAN>query parameter:</P><P> </P><pre class="lia-code-sample language-javascript"><code>/sap.graph/SalesQuote?$top=1&$select=netAmount&$expand=items</code></pre><P> </P><P>This will result in the items array being returned as part of the SalesQuote response as illustrated here:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="expand-items-1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/83064i8DCDA62DE7F4CBC2/image-size/large?v=v2&px=999" role="button" title="expand-items-1.png" alt="expand-items-1.png" /></span></P><P>If we have a look at a response snippet, this is what is being returned:</P><DIV class=""> </DIV><P> </P><pre class="lia-code-sample language-json"><code>{
"@odata.context": "$metadata#SalesQuote(netAmount,id,items())",
"value": [
{
"id": "cxsales~1",
"netAmount": 890,
"items": [
{
"itemId": "10",
"parentItemId": "",
"alternativeToItemId": "",
"itemCategory": "AGN",
"itemText": "Green Emission Calculator",
"product": "P300100",
"soldToPartyProductId": "",
"quantity": 1,
"quantityUnit": "EA",
"grossWeight": 0,
"grossWeightUnit": "",
"netWeight": 0,
"netWeightUnit": "",
"volume": 0,
"volumeUnit": "",
"plant": "",
"netAmount": 890,
"netAmountCurrency": "USD",
"pricingProduct": "",
"incotermsClassification": "",
"incotermsLocation": "",
"processingStatus": "1",
"cancellationReason": ""
}
]
}
]
}</code></pre><P> </P><P>Note that we do not have to specify expanded properties explicitly as part of<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$select</FONT>.</P><P>We see that the item in the example above has a property product that references an id. When we inspect the metadata of the items by searching for the EntityType<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">SalesQuote_items</FONT>. We see that the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">product</FONT><SPAN> </SPAN>property represents the referenced product with a string value and the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">_product</FONT><SPAN> </SPAN>navigation property references the connected <FONT face="terminal,monaco" color="#800000">sap.graph.Product</FONT> entity.</P><P> </P><pre class="lia-code-sample language-markup"><code><EntityType Name="SalesQuote_items">
<Key>
<PropertyRef Name="itemId"/>
</Key>
<Property Name="itemId" Type="Edm.String" MaxLength="10" Nullable="false"/>
<Property Name="itemText" Type="Edm.String"/>
<Property Name="product" Type="Edm.String"/>
<NavigationProperty Name="_product" Type="sap.graph.Product"/>
...
</EntityType></code></pre><P> </P><P>To also include this<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">_product</FONT><SPAN> </SPAN>as part of the response, we can expand it inside the already expanded <FONT face="terminal,monaco" color="#800000">items</FONT>: a nested expand.</P><DIV class=""> </DIV><P> </P><pre class="lia-code-sample language-javascript"><code>/sap.graph/SalesQuote?$top=1&$select=netAmount&$expand=items($expand=_product)</code></pre><P> </P><P>Which will include the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">_product</FONT><SPAN> </SPAN>response inline in the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">item</FONT><SPAN> </SPAN>of the SalesQuote response.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nested-expand-1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/83066i62D6195D5E9449B9/image-size/large?v=v2&px=999" role="button" title="nested-expand-1.png" alt="nested-expand-1.png" /></span></P><P><SPAN>If we also want to adapt the format of the expanded product we can nest a </SPAN><FONT face="terminal,monaco" color="#800000">$select</FONT><SPAN> query parameter in parentheses after the product. To restrict the nested product to the <FONT face="terminal,monaco" color="#800000">displayId</FONT>, for example:</SPAN></P><P> </P><pre class="lia-code-sample language-javascript"><code>/sap.graph/SalesQuote?$top=1&$select=netAmount&$expand=items($expand=_product($select=displayId))</code></pre><P> </P><P><SPAN>If we also want to select more properties, such as </SPAN><FONT face="terminal,monaco" color="#800000">netAmountCurrency</FONT><SPAN>, we can just add them to the </SPAN><FONT face="terminal,monaco" color="#800000">$select</FONT><SPAN> query parameter targeting the SalesQuote, separated by commas:</SPAN></P><P> </P><pre class="lia-code-sample language-javascript"><code>/sap.graph/SalesQuote?$top=1&$select=netAmount,netAmountCurrency&$expand=items($expand=_product($select=displayId))</code></pre><P> </P><P>The response for the SalesQuote with included<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">netAmountCurrency</FONT>,<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">items</FONT><SPAN> </SPAN>and<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">_product</FONT><SPAN> </SPAN>now looks like this:</P><P> </P><pre class="lia-code-sample language-json"><code>{
"@odata.context": "$metadata#SalesQuote(netAmount,netAmountCurrency,id,items(_product(displayId,id)))",
"value": [
{
"id": "cxsales~1",
"netAmount": 890,
"netAmountCurrency": "USD",
"items": [
{
"itemId": "10",
"parentItemId": "",
"alternativeToItemId": "",
"itemCategory": "AGN",
"itemText": "Green Emission Calculator",
"product": "P300100",
"_product": {
"id": "cxsales~P300100",
"displayId": null
},
"soldToPartyProductId": "",
"quantity": 1,
"quantityUnit": "EA",
"grossWeight": 0,
"grossWeightUnit": "",
"netWeight": 0,
"netWeightUnit": "",
"volume": 0,
"volumeUnit": "",
"plant": "",
"netAmount": 890,
"netAmountCurrency": "USD",
"pricingProduct": "",
"incotermsClassification": "",
"incotermsLocation": "",
"processingStatus": "1",
"cancellationReason": ""
}
]
}
]
}</code></pre><P> </P><H2 id="toc-hId-203668467">Working with collections: filtering, ordering and pagination</H2><P>When working with collections of entities, we typically want to filter the entities by some criteria or arrange them in a specific order. In OData this is supported via the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$filter</FONT><SPAN> </SPAN>and<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$orderby</FONT><SPAN> </SPAN>query parameters. With<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$top</FONT><SPAN> </SPAN>and<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$skip</FONT><SPAN> </SPAN>we can additionally define a sliding window over the result to implement pagination.</P><P>To continue with our example above, let's remove the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$top=1</FONT><SPAN> </SPAN>we added initially to now retrieve a collection of SalesQuotes. Say we want to retrieve all SalesQuotes with a value greater than 100 U.S. Dollars.</P><P>The value condition can be formulated with the greater equal operator:<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">netAmount ge 100</FONT>. For the currency condition we need to compare it with a string (enclosed in single quotes) for equality:<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">netAmountCurrency eq 'USD'</FONT>. We then combine these conditions with a logical and expression and add it to the example query below. We also define an ordering on the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">netAmount</FONT><SPAN> </SPAN>property with the<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$orderby</FONT><SPAN> </SPAN>query parameter, which is ascending by default.</P><BLOCKQUOTE><P>Note: OData operators are lower-case and space-separated. This requires URL encoding. If you are using Postman for this tutorial you don't need to worry as Postman automatically applies URL encoding. </P></BLOCKQUOTE><P> </P><pre class="lia-code-sample language-javascript"><code>/sap.graph/SalesQuote?$select=netAmount,netAmountCurrency&$expand=items($expand=_product($select=displayId))&$filter=netAmount ge 100 and netAmountCurrency eq 'USD'&$orderby=netAmount</code></pre><P> </P><BLOCKQUOTE><P>Note: OData only supports writing filter expressions using a small vocabulary of filter operators. See here for a full list.</P></BLOCKQUOTE><P>As a last step, we will now define a paging-window over all results. This can be achieved with the query parameters<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$top</FONT>, which specifies how many result entities should be returned: the page size, and<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$skip</FONT>, which defines how many result entities should be skipped from the beginning of the ordering. Hence, we describe the page size with<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$top</FONT><SPAN> </SPAN>and index the single pages with multiples of the page size in<SPAN> </SPAN><FONT face="terminal,monaco" color="#800000">$skip</FONT>. For the second page of five entities each, this would translate to our example as follows:</P><DIV class=""> </DIV><P> </P><pre class="lia-code-sample language-javascript"><code>/sap.graph/SalesQuote?$select=netAmount,netAmountCurrency&$expand=items($expand=_product($select=displayId))&$filter=netAmount ge 100 and netAmountCurrency eq 'USD'&$orderby=netAmount&$top=5&$skip=5</code></pre><P> </P><H2 id="toc-hId-7154962">Summary</H2><P>In this tutorial we had a look at OData, one of the two data protocols used by Graph. We covered all the features that you as a developer working with Graph need to know, like how to:</P><UL><LI>formulate complex queries</LI><LI>inspect the metadata and structure of the unified data model</LI><LI>expand and restrict responses</LI><LI>work with collections</LI></UL><P>OData itself offers much more than what we showed in this tutorial. You can read more about it in the<SPAN> </SPAN><A href="https://docs.oasis-open.org/odata/odata/v4.01/os/part2-url-conventions/odata-v4.01-os-part2-url-conventions.html" target="_blank" rel="nofollow noopener noreferrer">standard</A>.</P><P>With Graph, you as a developer now have one data protocol you can use together with one API to retrieve data in one unified format, no matter the source system.</P><P>---<BR />Florian Moritz</P><P> </P>2024-03-19T14:21:24.058000+01:00https://community.sap.com/t5/product-lifecycle-management-blog-posts-by-members/creating-a-dynamic-graph-to-use-as-an-spc-chart-purposes/ba-p/13646933Creating a dynamic graph to use as an SPC chart purposes2024-03-26T20:23:31.719000+01:00egeAksoyekhttps://community.sap.com/t5/user/viewprofilepage/user-id/879950<P>In this project, we aimed to create a dynamic graph to use as an SPC Chart, ["Fig. 1."]. In order to achieve this, we created a custom plugin to view the graph from the POD, custom tables in a cloud database to feed data to the graph, the process to add data to the database and create scenario-based actions, tags to read data from the shop-floor, and a subscription.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="["Figure 1- Overall Graph View"]" style="width: 876px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/85102iECB89F30F8CF1939/image-size/large?v=v2&px=999" role="button" title="Picture1.png" alt="["Figure 1- Overall Graph View"]" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">["Figure 1- Overall Graph View"]</span></span></P><H3 id="toc-hId-1118961666"><STRONG>Details & Design of the Development</STRONG></H3><P>In our scenario, there will be five random measurements values at the first operation of an order. Our main process is triggered by the input fed by the tag in the form of an (sfc,value) structure, when related tag value changed, it is catched by the subscription created via the Automatic Trigger App, and this subscription triggers a spesific process. [“Fig. 2.”]</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="["Figure 2 - Main Process"]" style="width: 825px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/87083i5D01838AD1A3A6AD/image-size/large?v=v2&px=999" role="button" title="Picture2.png" alt="["Figure 2 - Main Process"]" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">["Figure 2 - Main Process"]</span></span></P><P>Within the process, after separating this input into sfc and value, further information about the sfc, such as resources, is obtained using Retrieve Sfc Details Service.</P><P>After getting the SFC details there is a parallel condition to invoke both a second process [“Fig. 3.”] and a custom service that adds data to the 'z_spc_period' table ["Fig. 4."]. With the second process, we aimed to update the resource status as 'SCHEDULED_DOWN' and send a notification to a Teams Channel, when the value falls outside the maxOut and minOut limits. For the maxValue and minValue violations, we aimed to log a pre-defined Nc code, change the status of the SFC to 'HOLD' and send a notification to a Teams Channel with this process.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="["Figure 3 - Second Process"]" style="width: 801px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/85104iF97BB1DE73C3B5E9/image-size/large?v=v2&px=999" role="button" title="Picture3.png" alt="["Figure 3 - Second Process"]" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">["Figure 3 - Second Process"]</span></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="["Figure 4 - z_spc_period Table"]" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/86445i9BE7A7B65C72326A/image-size/medium?v=v2&px=400" role="button" title="Picture6 -spcPeriod.png" alt="["Figure 4 - z_spc_period Table"]" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">["Figure 4 - z_spc_period Table"]</span></span></P><P>We created 3 graphs as; SPC, Average Value, Value Gap. When the custom plugin screen opened, the Average Graph is preselected. To facilitate ease of use, there are total of 5 filters that are same to all graph selections: Workcenter, Resource, Order, SFC, and Material. Average value graph gives the average of values for a completed period. Calculation is performed based on the values from the custom 'z_spc_period' table and the results are inserted in the 'z_spc_value' table at the cloud DB [Fig.5.], however the max. number of values that could be in a period can be changed from the process design that we create, by editing the maxDataNum value.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="["Figure 5 - z_spc_value Table"]" style="width: 547px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/86446iE6603F29687922E6/image-size/large?v=v2&px=999" role="button" title="Picture7 - spcValue.png" alt="["Figure 5 - z_spc_value Table"]" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">["Figure 5 - z_spc_value Table"]</span></span></P><P>SPC graph gives the value versus period ID graph based on a SFC. As this graph functions based on a SFC, SFC field at the filter section becomes mandatory. Graph also shows the maxValue&minValue limits, maxOut&minOut limits and for the points that exceeds those limits there is an NC logging option. To log an NC, user need to click on the desired data-point and the NC log button from the info box that is opened [“Fig. 6.”]. This button will lead to a pop-up NC Logging screen [“Fig. 7.”].</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="["Figure 6 - Info Box of Data Point"]" style="width: 278px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/85105i797E716BF7076802/image-size/large?v=v2&px=999" role="button" title="Picture4.png" alt="["Figure 6 - Info Box of Data Point"]" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">["Figure 6 - Info Box of Data Point"]</span></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="["Figure 7 - Custom NC Log Popup"]" style="width: 700px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/85106iDB73087182FDAF81/image-size/large?v=v2&px=999" role="button" title="Picture5.png" alt="["Figure 7 - Custom NC Log Popup"]" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">["Figure 7 - Custom NC Log Popup"]</span></span></P><H3 id="toc-hId-922448161"><STRONG>Demo Video</STRONG></H3><P><STRONG><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FLHKDkSimoEY%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DLHKDkSimoEY&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FLHKDkSimoEY%2Fhqdefault.jpg&type=text%2Fhtml&schema=youtube" width="200" height="112" scrolling="no" title="SAP DM - Production Management and Monitoring Based on Real-time SPC Measurements" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></STRONG></P><P>If you like this post or have any questions, please let us know in the comments.<BR />All questions are highly appreciated.</P><H2 id="toc-hId-596851937"><STRONG>Dilahan Çiloğlu & Ege Aksöyek</STRONG></H2>2024-03-26T20:23:31.719000+01:00https://community.sap.com/t5/artificial-intelligence-blogs-posts/knowledge-graphs-on-datasphere-and-hana-cloud-the-differences/ba-p/13654058Knowledge Graphs on Datasphere and HANA Cloud. The differences2024-04-02T16:59:17.079000+02:00MarioDeFelipehttps://community.sap.com/t5/user/viewprofilepage/user-id/13491<DIV class=""><DIV class=""><DIV class=""><P>The ability to enhance RAG with Vector search, Graph knowledge bases, or SQL Queries is fundamental. SAP recently announced the Datasphere capability to create Graphs, and there are some key differences between the graph capabilities in SAP HANA Cloud, the new announcement SAP Datasphere knowledge <STRONG>graph and the Intergation Suite capability called <STRONG>Graph:</STRONG></STRONG></P><P><FONT size="5"><STRONG>1. SAP HANA Cloud </STRONG></FONT>has had a powerful graph engine for analyzing complex relationships in business data for a while now. It allows creating graph workspaces from existing tables/views, querying graphs using openCypher, writing custom graph algorithms, and visualizing graphs.</P><P><FONT size="5"><STRONG><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="MarioDeFelipe_0-1711871921205.gif" style="width: 720px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/88842i79E885F87B9C597E/image-size/large?v=v2&px=999" role="button" title="MarioDeFelipe_0-1711871921205.gif" alt="MarioDeFelipe_0-1711871921205.gif" /></span></SPAN></STRONG></FONT></P><P> </P><P><A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-hana-graph-resources/ba-p/13505490" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/sap-hana-graph-resources/ba-p/13505490</A></P><P><A href="https://www.youtube.com/watch?v=oaSQu9laYKE" target="_blank" rel="noopener nofollow noreferrer">https://www.youtube.com/watch?v=oaSQu9laYKE</A></P><P><STRONG><FONT size="5">2. Datasphere </FONT></STRONG>Creating knowledge graphs manually is very costly, so SAP Datasphere comes to help by automatically pre-populating them using content already available in SAP Datasphere like connections to source systems, tables, foreign keys etc. SAP Datasphere knowledge graph is a new capability announced in March 2024. As data is onboarded and integrated into SAP Datasphere, it automatically creates an ontology representing the relationships in the data, including business context from SAP sources like S/4HANA</P><P><STRONG><FONT size="5"><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="caption by SAP. Currently in Preview" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/88841i7101106D538F7C87/image-size/large?v=v2&px=999" role="button" title="MarioDeFelipe_1-1711871921042.jpeg" alt="caption by SAP. Currently in Preview" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">caption by SAP. Currently in Preview</span></span></SPAN></FONT></STRONG></P><P> </P><P><FONT size="3"><A href="https://www.youtube.com/watch?v=PQrFjthwOWQ&t=169" target="_blank" rel="noopener nofollow noreferrer">https://www.youtube.com/watch?v=PQrFjthwOWQ&t=169</A></FONT></P><P><A href="https://news.sap.com/2024/03/future-of-data-driven-business-new-sap-datasphere-capabilities/" target="_blank" rel="noopener noreferrer">https://news.sap.com/2024/03/future-of-data-driven-business-new-sap-datasphere-capabilities/</A></P><P><FONT size="5"><STRONG>3. SAP Graph as an Integration Suite capability </STRONG></FONT></P><P><SPAN class="">Parallel to building Graphs from Databases, SAP Graph is an alternative unified API available on the SAP Business Technology Platform that provides access to a connected graph of SAP-managed business data, regardless of where the data resides<SPAN class=""><SPAN class="">.</SPAN></SPAN></SPAN></P><P><SPAN class="">SAP Graph is intended for building extension applications, such as workflow applications using low-code tools or event-driven applications, and it supports modern open standards like OData v4 and GraphQL</SPAN></P><P><SPAN class=""> </SPAN></P><P><SPAN class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="youtube-video-gif4.gif" style="width: 720px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/88847i7A79487F2DE6E4F2/image-size/large?v=v2&px=999" role="button" title="youtube-video-gif4.gif" alt="youtube-video-gif4.gif" /></span></SPAN></P><P> </P><P><SPAN class=""><A href="https://podcast.opensap.info/cloud-platform/2022/04/28/episode-82-sap-graph-the-easy-to-use-api-of-the-intelligent-enterprise/" target="_blank" rel="noopener nofollow noreferrer">https://podcast.opensap.info/cloud-platform/2022/04/28/episode-82-sap-graph-the-easy-to-use-api-of-the-intelligent-enterprise/</A></SPAN></P><P><SPAN class=""><A href="https://community.sap.com/t5/technology-blogs-by-sap/graph-new-in-sap-integration-suite/ba-p/13555887" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/graph-new-in-sap-integration-suite/ba-p/13555887</A></SPAN></P><P><FONT size="5"><STRONG>Conclusion</STRONG></FONT></P><P>While the SAP HANA Cloud graph is more for custom graph algorithm development and analysis, the SAP Datasphere knowledge graph is an automated capability that provides a rich context for generative AI use cases by capturing complex data relationships and metadata. The two serve different but complementary purposes in the SAP data and analytics portfolio.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2024-04-08 at 09.37.45.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/92677iF47B4275CEAAE9EE/image-size/large?v=v2&px=999" role="button" title="Screenshot 2024-04-08 at 09.37.45.png" alt="Screenshot 2024-04-08 at 09.37.45.png" /></span></P><P> </P><P><STRONG>Additional information:<BR /><A href="https://www.linkedin.com/pulse/how-use-sap-hana-cloud-graph-model-analyze-complex-your-holitschke" target="_blank" rel="noopener nofollow noreferrer">https://www.linkedin.com/pulse/how-use-sap-hana-cloud-graph-model-analyze-complex-your-holitschke</A></STRONG></P><P><A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-hana-graph-resources/ba-p/13505490" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/sap-hana-graph-resources/ba-p/13505490</A></P><P><A href="https://community.sap.com/t5/technology-q-a/native-hana-vs-sap-datasphere-findings/qaq-p/12689997" target="_blank">https://community.sap.com/t5/technology-q-a/native-hana-vs-sap-datasphere-findings/qaq-p/12689997</A></P><P><A href="https://www.techzine.eu/blogs/data-management/117331/sap-expands-datasphere-with-knowledge-graph-and-compass/" target="_blank" rel="noopener nofollow noreferrer">https://www.techzine.eu/blogs/data-management/117331/sap-expands-datasphere-with-knowledge-graph-and...</A></P><P><A href="https://community.sap.com/t5/technology-q-a/sap-datasphere-is-an-alternative-of-sap-hana-modelling-with-more-features/qaq-p/12701049" target="_blank">https://community.sap.com/t5/technology-q-a/sap-datasphere-is-an-alternative-of-sap-hana-modelling-w...</A></P><P><A href="https://community.sap.com/t5/technology-blogs-by-members/access-sap-hana-cloud-underneath-of-sap-datasphere/ba-p/13569825" target="_blank">https://community.sap.com/t5/technology-blogs-by-members/access-sap-hana-cloud-underneath-of-sap-dat...</A></P><P><A href="https://developers.sap.com/group.hana-aa-graph-overview.html" target="_blank" rel="noopener noreferrer">https://developers.sap.com/group.hana-aa-graph-overview.html</A></P></DIV></DIV></DIV>2024-04-02T16:59:17.079000+02:00https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-members/appraisal-item-categories-in-sap-sd/ba-p/13895268Appraisal-Item categories in SAP SD2024-10-10T14:52:02.844000+02:00Behram1https://community.sap.com/t5/user/viewprofilepage/user-id/899821<P>In SAP Sales and Distribution (SD), item categories play a crucial role in determining how sales documents are processed. Each item category controls various aspects of sales transactions, including pricing, billing, delivery, and inventory management. Here are some common item categories used in SAP SD:</P><P>1. **Standard Item (TAN)**:<BR />- This is the most commonly used item category for selling products. It allows for pricing, delivery, and billing.</P><P>2. **Service Item (SERV)**:<BR />- Used for services instead of goods. This category typically does not involve inventory management and is often tied to service contracts.</P><P>3. **Text Item (TXT)**:<BR />- Used for non-billable items such as comments or notes. It does not affect pricing or inventory.</P><P>4. **Free of Charge Item (NORM)**:<BR />- This item category is used for items provided at no charge, allowing for the processing of delivery and billing without affecting sales revenue.</P><P>5. **Subsequent Delivery (LUMF)**:<BR />- Used for subsequent deliveries of previously sold items, often utilized in situations where partial deliveries occur.</P><P>6. **Consignment Item (CST1/CST2)**:<BR />- These categories are used for consignment stock scenarios, where goods are stored at the customer’s location but remain owned by the supplier until sold.</P><P>7. **Returnable Packaging (VERP)**:<BR />- Used for items that are returnable, such as crates or pallets. This item category helps manage inventory levels for packaging materials.</P><P>8. **Cash Sales Item (CS)**:<BR />- Used in cash sales scenarios where the customer pays immediately, and the sales process is expedited.</P><P>9. **Intercompany Item (IV)**:<BR />- Used for intercompany transactions between different entities within the same organization.</P><P>10. **Sales Order Item (OR)**:<BR />- This category is used for processing orders that require specific handling or conditions.</P><P>Each item category has specific settings that influence the behavior of sales documents and the underlying logistics processes. The configuration of item categories can be customized to fit the specific needs of a business.</P>2024-10-10T14:52:02.844000+02:00https://community.sap.com/t5/integration-blog-posts/please-share-your-experience-new-api-management-survey/ba-p/13950848Please share your experience - new API Management survey2024-11-28T12:08:40.807000+01:00Chaim_Bendelachttps://community.sap.com/t5/user/viewprofilepage/user-id/194397<P>Dear <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1862993">@Pa_Vi</a> Integration Customers,</P><P>We are always eager to learn more about how our customers interact with SAP Integration Suite.</P><P>In particular, we are interested in hearing how you use the <STRONG>API Management</STRONG> capability of SAP Integration Suite —or why you might <EM>not</EM> use it yet. Whether you’re an experienced API administrator, an integration specialist, or have never used API Management, we’d love to hear from you!</P><P>Your feedback helps shape the future of SAP Integration Suite and meet your needs better. </P><P><STRONG>Who Should Participate?</STRONG></P><P> ✓ Current API Management users: Share how you're implementing and benefiting from the capability<BR /> ✓ Customers not currently using API Management: Help us understand your reasons and challenges</P><P><STRONG>Survey: <A href="https://sapinsights.eu.qualtrics.com/jfe/form/SV_e3wbmDkZ4eGGgd0" target="_blank" rel="noopener nofollow noreferrer">Usage of API Management</A> </STRONG></P><P><EM>Hugely appreciated! <span class="lia-unicode-emoji" title=":slightly_smiling_face:">🙂</span></EM></P><P>--<BR />Chaim Bendelac<BR />Product Manager - SAP Integration Suite</P>2024-11-28T12:08:40.807000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/simplify-connectivity-to-improve-developer-efficiency-with-the-help-of/ba-p/13981698Simplify connectivity to improve developer efficiency with the help of Enterprise Automation2025-01-10T12:23:26.962000+01:00Palakhttps://community.sap.com/t5/user/viewprofilepage/user-id/17091<P>co-authored by: <SPAN><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/5123">@EvgeniyGorbunov</a></SPAN></P><P>Hello everyone!</P><P><SPAN> </SPAN><SPAN>With Enterprise Automation with SAP, we bring together technologies such as SAP Signavio, SAP Integration Suite and SAP Build in order to provide a unified framework to address process analysis, automation and integration needs of an intelligent enterprise. </SPAN><SPAN> </SPAN></P><P><SPAN>These technologies have multiple integration touchpoints and can be used together for the best benefit in a vast amount of use-cases.</SPAN><SPAN> </SPAN></P><P><SPAN>You can find more detailed information about the Enterprise Automation with SAP <A href="https://www.sap.com/products/technology-platform/enterprise-automation.html" target="_blank" rel="noopener noreferrer">here</A>.</SPAN></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Palak_0-1736429722376.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210171i4DF94C258B309717/image-size/large?v=v2&px=999" role="button" title="Palak_0-1736429722376.png" alt="Palak_0-1736429722376.png" /></span></P><P><STRONG>Practical need</STRONG></P><P>In this blog post, I would like to focus on one <STRONG>specific usage pattern </STRONG>of the Enterprise Automation framework: how to ensure the developer efficiency while simplifying connectivity to underlying data sources. It is always better to explain such pattern with a practical scenario, so let us look into the manufacturing area as an example.</P><P>An organization wants a clear view of all maintenance orders and material reservations for the equipment maintenance. The bigger the company is, more the equipment it possesses – and it is vital to ensure the right maintenance timelines and see all the issues in a transparent way.</P><P>For this, the company needs to gather data from multiple sources and display it in a user interface. Later, the responsible person can review the information in a dashboard-like format and proceed with sending the relevant maintenance and repair orders.</P><P>How can they achieve their goal in a short time and with limited resources thanks to the Enterprise Automation capabilities?</P><P><STRONG>How does it work?</STRONG></P><P><EM> </EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Palak_1-1736429935971.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210174i1D433124101998CD/image-size/large?v=v2&px=999" role="button" title="Palak_1-1736429935971.png" alt="Palak_1-1736429935971.png" /></span></P><P>Graph is a powerful enhancement to API Management, capability of SAP Integration Suite, which supports in transforming APIs. You can easily and securely provide your integration and application developers with selective, abstracted access to your enterprise data via a single, easy-to-use API. The enterprise data is semantically connected in the form of a business data graph.</P><P>To build the end user interface SAP Build Apps is being used. SAP Build Apps is a professional application development solution providing an intuitive no-code development environment to empower business users and developers to create apps quickly and visually.</P><P><STRONG> </STRONG></P><P><STRONG>Setup</STRONG></P><P><STRONG> </STRONG>You can setup business data graph in your subaccount, where identity, trust and connectivity can be established between your applications, extensions and integrations, and your landscape. An advantage of Graph is that IT Administrators take care of the Business Data Graph as well as the destination’s configuration, while developers just consume the entities via Graph independent of which specific tenants they are working with.<BR /><BR />In our use case architecture, SAP Build Apps application consumes both SAP S/4 HANA Cloud entities Reservation and maintenance Order via Graph. User Identity is propagated from SAP Build Apps to Graph, and Graph will propagate the identity to each specific backend tenant to verify the end user authentication and authorization.</P><P><BR />Developers only connect to the Graph destination configured by IT Administrators without having to care about changes on the specific backend servers’ configuration.</P><P> </P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Palak_2-1736429980235.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210176i9DFBF23F3A5EB891/image-size/large?v=v2&px=999" role="button" title="Palak_2-1736429980235.png" alt="Palak_2-1736429980235.png" /></span></P><P> </P><P><STRONG>Creation of Graph custom entity </STRONG></P><P><STRONG> </STRONG>You can start by defining a custom entity using Graph Model extension editor in SAP Integration Suite. Reservation and maintenance order entities can be composed using the step-by-step business data graph extension wizard. The activated business data graph API will be binded to SAP build apps for further consumption.</P><P>Please refer <A href="https://community.sap.com/t5/technology-blogs-by-sap/api-composition-with-graph-customizing-your-business-data-graphs-with-model/ba-p/13639447" target="_blank">the blog post</A> to understand how a model extension is created.</P><P><STRONG> </STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Palak_3-1736429980252.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210177i288ECAACC57EBFF1/image-size/large?v=v2&px=999" role="button" title="Palak_3-1736429980252.png" alt="Palak_3-1736429980252.png" /></span></P><P> </P><P><STRONG> </STRONG><STRONG>Creating an app with SAP Build Apps</STRONG></P><P>Create a web and mobile application in SAP Build apps as per the custom scenario by consuming the data from Graph unified API.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Palak_4-1736429980258.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210175i0CAA16AB369277CB/image-size/large?v=v2&px=999" role="button" title="Palak_4-1736429980258.png" alt="Palak_4-1736429980258.png" /></span></P><P> </P><P>Once the Graph API is consumed, it makes it possible to execute queries by consuming data from multiple entities composed in Graph in a same UI Component.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Palak_5-1736429980269.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210178i34B9A7396E14A05E/image-size/large?v=v2&px=999" role="button" title="Palak_5-1736429980269.png" alt="Palak_5-1736429980269.png" /></span></P><P> </P><P>Now that we are done with configurations and designing the UI for the scenario, our scenario would look like the one recorded in the video <A href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_1rio56kt" target="_self" rel="nofollow noopener noreferrer">here.</A></P><P> </P><P><A href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_1rio56kt" target="_blank" rel="noopener nofollow noreferrer"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Palak_1-1736507267182.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210582i6E2B410D97B1A1ED/image-size/large?v=v2&px=999" role="button" title="Palak_1-1736507267182.png" alt="Palak_1-1736507267182.png" /></span></A></P><P> </P><P><STRONG>Summary:</STRONG></P><P>We saw how you can connect your applications using a unified API that abstracts underlying data sources using the Graph functionality of SAP Integration Suite. This way, you can consolidate the data, expose and easily reuse it in your application at the runtime.</P><P>But that is not all. We looked at an example with an application above. On top of that, we also face the need to have an abstraction layer to connect data to the process flow, created in SAP Build Process Automation. We can ensure API connectivity from the process using actions to encapsulate API calls, and by using Graph we can simplify this connectivity by having one unified layer underneath. If we put it in frame of a scenario above, if we need an additional approval step to coordinate, we can leverage SAP Build Apps, SAP Build Process Automation and Graph in one unified scenario.</P><P>Find more detailed information about the Enterprise Automation with SAP and how to get started in <A href="https://community.sap.com/t5/sap-builders-blog-posts/how-to-get-started-with-enterprise-automation/ba-p/13582512" target="_blank">the blog post.</A></P><P>Find more information about Graph in SAP Integration Suite in <A href="https://community.sap.com/t5/technology-blogs-by-sap/information-map-introduction-series-graph-in-sap-integration-suite/ba-p/13614448" target="_blank">this blog post series</A>.</P><P>And use the <A href="https://pages.community.sap.com/topics/integration-suite" target="_blank" rel="noopener noreferrer">community page</A> of SAP Integration Suite for more information and exchange on the SAP Graph topic.</P>2025-01-10T12:23:26.962000+01:00https://community.sap.com/t5/integration-blog-posts/supercharge-efficiency-with-enterprise-automation-sap-build-and-sap/ba-p/14006724Supercharge efficiency with Enterprise Automation: SAP Build and SAP Integration Suite2025-02-05T18:22:37.224000+01:00Manuel_Namyslohttps://community.sap.com/t5/user/viewprofilepage/user-id/97167<P>The ability to intelligently automate business processes is top of mind for many stakeholders involved in process management across organizations. According to a recent IDC study, annual spending on Intelligent Process Automation (IPA) technologies is projected to reach $102 billion by 2028. Of this, $19.9 billion will be allocated to AI-powered automation tools, with an impressive annual growth rate of 43.4%.</P><P>While there will be certainly no shortage in resources to spend for automation software, the real challenge remains in the details: How can organizations implement a holistic approach for process excellence, which allows them to manage processes, identify bottlenecks, deliver scalable automations and integrate their process extension within a holistic process landscape. In my previous <SPAN><A href="https://community.sap.com/t5/sap-builders-blog-posts/how-to-get-started-with-enterprise-automation/ba-p/13582512" target="_blank">blogpost</A></SPAN> I have already outlined in detail how SAP’s framework on Enterprise Automation delivers an solution to the problem statement mentioned above.</P><P>And this blogpost series will offer you a more detailed guidance on the interconnectivity of each service included in Enterprise Automation which are:</P><UL><LI><STRONG>SAP Build Process Automation</STRONG></LI><LI><STRONG>SAP Integration Suite</STRONG></LI><LI>and of course <STRONG>SAP Signavio.</STRONG></LI></UL><P>Let’s explore the value you can unlock for your processes by combining SAP Build Process Automation with SAP Integration Suite in this one.</P><P> </P><P><STRONG>What is Enterprise Automation?</STRONG></P><P>As outlined in my previous <SPAN><A href="https://community.sap.com/t5/sap-builders-blog-posts/how-to-get-started-with-enterprise-automation/ba-p/13582512" target="_blank">blogpost</A></SPAN> Enterprise Automation with SAP: Enterprise automation with SAP software provides an integrated set of tools for process mining, automation, integration, monitoring, and optimization of your processes and workflows. It helps you quickly and intuitively gain insights into your business processes and identify the right automation tool for the right outcome. While each solution can be leveraged independently, Enterprise Automation offer native integration between SAP Build, SAP integration Suite and SAP Signavio – supplemented with best practices, guidance and pre-build content which can be implemented directly.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Blogpost1Enterprise Automation _Learning_Journey.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221704i72BC106E2FCF7F63/image-size/large?v=v2&px=999" role="button" title="Blogpost1Enterprise Automation _Learning_Journey.jpg" alt="Blogpost1Enterprise Automation _Learning_Journey.jpg" /></span></P><P> </P><UL><LI><STRONG>SAP Signavio</STRONG> provides visibility into business processes and potential bottlenecks, root-cause analysis, and suggestions for improvement based on 200,000 industry benchmarks and best practices. This detailed understanding of inefficiencies across your organization enables you to optimize and automate processes.</LI><LI><STRONG>SAP Integration Suite</STRONG> is an integration platform as a service with thousands of prebuilt integrations, APIs, events and connectors to SAP and third-party software applications. The suite reduces complexity across on-premise and multi-cloud environments, helping you optimize comprehensive business processes.</LI><LI><STRONG>SAP Build</STRONG> to create automations and applications usingthe low-code and no-code design tools. Including pre-built automations and connectors for SAP software and third-party systems, the solutions let your business experts rapidly address process inefficiencies</LI></UL><P> </P><P>Here you can also see a visualization of the main components and its respective capabilities:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="blogpost2Enterprise Automation _Learning_Journey.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221706i1302DC0C9508DEFC/image-size/large?v=v2&px=999" role="button" title="blogpost2Enterprise Automation _Learning_Journey.jpg" alt="blogpost2Enterprise Automation _Learning_Journey.jpg" /></span></P><P> </P><H2 id="toc-hId-1701911686"><STRONG>Leverage the combined power of SAP Build Process Automation and SAP Integration Suite</STRONG></H2><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Enterprise Automation L2 (3) (3) (2) (3) (1) (2) (1).jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/223541iA1ED41A0E2C0DE9E/image-size/large?v=v2&px=999" role="button" title="Enterprise Automation L2 (3) (3) (2) (3) (1) (2) (1).jpg" alt="Enterprise Automation L2 (3) (3) (2) (3) (1) (2) (1).jpg" /></span></P><P> </P><H3 id="toc-hId-1634480900"><STRONG>1st scenario: Integrate to innovate</STRONG></H3><P>The first scenario we are going to cover in this blogpost is about building required process extensions and integrating the to your systems of records. <STRONG>SAP Build Process Automation</STRONG> allows you to create entirely new business processes and automation from scratch. However, during development, you may need advanced integration capabilities and various types of connectors to link your processes with different systems, whether cloud-based or on-premise, and whether using SAP or third-party platforms.</P><P>Integration Suite, you can natively trigger an iFlow created in SAP Integration Suite at any point within your process definition. This is particularly useful when handling tasks like data transformation, entity mapping, field validation, or accessing over 250 connectors such as iDoc, SOAP, SMTP, Kafka, and more. Moreover, customers that start their process excellence journey with Integration Suite can complement their integration styles with additional automation capabilities like approval workflows, business rules or RPA bots that have been provisioned with SAP Build Process Automation.</P><P>Let’s jump into an example. In the screenshot below you can see a process definition within Build Process Automation to automate the creation of Purchase Requisitions within your organization:</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2025-01-20 143325.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221709iDC8448E21E264C1E/image-size/large?v=v2&px=999" role="button" title="Screenshot 2025-01-20 143325.png" alt="Screenshot 2025-01-20 143325.png" /></span></P><P> </P><P>Once all the parameters and required approvals are fulfilled, we want to create a PR document within our system of record. In the first Action of the screenshot below you can see that we are natively calling an OData service to directly push this new PR within our SAP S/4HANA on-premise system. But in the second Action, we trigger an additional Integration Flow (iFlow) that has been established within the SAP Integration Suite:</P><P> <span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Enterprise Automation _Learning_Journey.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221710iBC0FA09E0F650C7B/image-size/large?v=v2&px=999" role="button" title="Enterprise Automation _Learning_Journey.jpg" alt="Enterprise Automation _Learning_Journey.jpg" /></span></P><P> </P><P>This is done rather quickly thanks to the ability to natively trigger an iFlow within the Action design-time of SAP Build Process Automation, which is also documented in our <SPAN><A href="https://help.sap.com/docs/build-process-automation/sap-build-process-automation/using-integration-flow?locale=en-US" target="_blank" rel="noopener noreferrer">Help-Portal:</A></SPAN></P><P> </P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Enterprise Automation _Learning_Joddddurney.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221712iB9C292463E202287/image-size/large?v=v2&px=999" role="button" title="Enterprise Automation _Learning_Joddddurney.jpg" alt="Enterprise Automation _Learning_Joddddurney.jpg" /></span></SPAN></P><P> </P><P>This allows you to include in iFlow within your process definition whenever it is necessary. Because in the iFlow design-time of the Integration Suite you can establish any scenario that is relevant, make use of data validation and entity mapping, and use more than 250 different connectors to integrate to any backend application. The connectivity options and adapters are also documented within the <SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/connectivity-options" target="_blank" rel="noopener noreferrer">Help-Portal</A></SPAN>. In this screenshot you can see how the iFlow replicates the PR document in our MM-module of SAP ECC by using a SOAP adapter:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Enterprise Automation _Learnwwwing_Journey.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221713i54AF3A6F10D9F401/image-size/large?v=v2&px=999" role="button" title="Enterprise Automation _Learnwwwing_Journey.jpg" alt="Enterprise Automation _Learnwwwing_Journey.jpg" /></span></P><P> And here you can see an example how entity mapping looks like: We are mapping the corresponding data fields of the OData service to the SOAP service to make sure that no data gets lost or misinterpreted.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2025-01-20 144230.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221714iCAB3C105C472CF68/image-size/large?v=v2&px=999" role="button" title="Screenshot 2025-01-20 144230.png" alt="Screenshot 2025-01-20 144230.png" /></span></P><P> </P><H3 id="toc-hId-1437967395"><STRONG>2nd scenario: Event-driven architectures</STRONG></H3><P>Another common use case for combining <STRONG>SAP Build</STRONG> and <STRONG>SAP Integration Suite</STRONG> is in the area of <STRONG>event-driven architectures</STRONG>. Thanks to the <STRONG>Event Mesh</STRONG> service available in SAP Integration Suite, you can listen to and subscribe to critical business events, whether they are happening within your SAP or non-SAP environment. This also includes the new <STRONG>Advanced Event Mesh</STRONG> service, which offers more capabilities, broader deployment options, and the ability to handle larger payloads compared to the regular Event Mesh service.</P><P><STRONG>SAP Build</STRONG> provides native connectivity to both Event Mesh and Advanced Event Mesh, enabling you to proactively trigger process instances without human intervention, based on business events as they occur.</P><P>For instance, you can use Advanced Event Mesh to listen for and subscribe to the creation of business partners within your <STRONG>S/4HANA</STRONG> system, as well as in third-party systems. Whenever a new business partner is created, SAP Build triggers a process instance to validate the data, sending approval notifications to business users to assign addresses and payment information for the new business partner, ensuring high data quality.</P><P>By integrating event-driven architectures with SAP Build, you can significantly increase the processing speed of your business workflows, reduce human intervention, and enhance operational excellence for your IT department.</P><P>Here you can see a screenshot of the Advanced Event Mesh cockpit within SAP Integration Suite:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2024-04-10 144330.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221716i4221D6E35181E0B0/image-size/large?v=v2&px=999" role="button" title="Screenshot 2024-04-10 144330.png" alt="Screenshot 2024-04-10 144330.png" /></span></P><P> </P><P>You can listen and subscribe to multiple events by creating queues in your SAP or non-SAP system within multiple regions and hyperscalers. For example it can be an event that indicates that a new business partner has been created within your ERP landscpape:</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2023-05-09 124748.png" style="width: 947px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221718i663E2A1CE60CD598/image-size/large?v=v2&px=999" role="button" title="Screenshot 2023-05-09 124748.png" alt="Screenshot 2023-05-09 124748.png" /></span></P><P> </P><P>Once this subscription has been established you can proactively trigger a workflow or automation task within SAP Build Process Automation. To stay within the example, you can trigger new approval workflows once a new business partner has been established. As a result, every time a new business partner has been entered, an additional approver makes sure that the payment details and to address of the organization has been assigned correctly. By doing so you increase the degree of data accuracy and compliance of your business processes while minimizing the degree of human intervention:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="ddddd.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221731i9E041326D1E54EA4/image-size/large?v=v2&px=999" role="button" title="ddddd.jpg" alt="ddddd.jpg" /></span></P><P> </P><P>Thanks to the native connectivity of SAP Build and our Event Mesh services you can easily select any event to trigger a process instance in SAP Build Process Automation. Further details on how to establish the connectivity can be found on the blogpost of my colleague Win, <SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/event-mesh-and-sap-s-4hana-public-cloud-setup-for-sap-build-process/ba-p/13791480" target="_blank">which can be found here</A></SPAN> or within the public documentation in the <SPAN><A href="https://help.sap.com/docs/build-process-automation/sap-build-process-automation/create-event-triggers" target="_blank" rel="noopener noreferrer">Help-Portal.</A></SPAN></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Enterprise Automation _Lsssearning_Journey.jpg" style="width: 656px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221734i76569B4466E0FD88/image-size/large?v=v2&px=999" role="button" title="Enterprise Automation _Lsssearning_Journey.jpg" alt="Enterprise Automation _Lsssearning_Journey.jpg" /></span></P><P> </P><P> </P><H3 id="toc-hId-1241453890"><STRONG>3rd scenario: Simplifying connectivity to improve developer efficiency</STRONG></H3><P>The final scenario for combining <STRONG>SAP Build</STRONG> and <STRONG>SAP Integration Suite</STRONG> involves our new consolidated API for SAP-managed data: <STRONG>Graph</STRONG>.</P><P><STRONG>Graph</STRONG> uses modern open standards like OData v4 and GraphQL, serving as a key capability within <STRONG>API Management</STRONG> in SAP Integration Suite. With Graph, developers can access your business data as a single, semantically connected data graph that spans the entire suite of SAP products and beyond. It is designed for SAP’s ecosystem of partner and customer developers, offering a powerful API that significantly reduces the cost and complexity of creating and deploying reusable extensions and other client applications.</P><P>As enterprise landscapes continue to expand in both scale and complexity, each new system, SaaS, or microservice introduces new protocols, data models, connectivity requirements, and security conventions. Real-world challenges often span multiple lines of business, services, and APIs, making it difficult even for experienced developers to grasp all the underlying technologies and interfaces. Creating new business-extending client applications requires a growing range of expertise and skills. The rise of low-code tools, now widely adopted by nonprofessional developers, further widens this gap.</P><P>Graph simplifies this complexity by allowing you to combine and expose data from multiple systems and data sources. You can then easily consume this API within <STRONG>SAP Build</STRONG>. At any point in your <STRONG>SAP Build Process Automation</STRONG> workflow, you can leverage an Action to retrieve, post, patch, put, or delete data within your SAP landscape.</P><P>This connectivity model allows you to interact with systems based on a unified enterprise data model, simplifying data access and avoiding unnecessary <STRONG>ETL</STRONG> processes and data replications for specific use cases.</P><P>Here you can also find a simplified architecture, that describes this scenario:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Palak_2-1736429980235.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221735i3E66340C083B4587/image-size/large?v=v2&px=999" role="button" title="Palak_2-1736429980235.png" alt="Palak_2-1736429980235.png" /></span></P><P> </P><P>Additionally, <STRONG>SAP Integration Suite</STRONG> allows you to leverage proven integration features such as <STRONG>API Management</STRONG>, which helps monitor and evaluate your connections. You can also apply critical policies to these connections to ensure compliance and secure operations.</P><P>Further details can be found <SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/simplify-connectivity-to-improve-developer-efficiency-with-the-help-of/ba-p/13981698" target="_blank">on the blogpost</A></SPAN> of my colleagues Palak Garg and Evgeniy Gorbunov.</P><P> </P><P> </P><H3 id="toc-hId-1044940385"><STRONG>Conclusion</STRONG></H3><P>I hope this blog post has helped you identify the key synergies between SAP Build and SAP Integration Suite and how they can enable seamless automation across your enterprise. Please remember that the use cases provided are just examples and can be tailored and refined to meet your specific needs.</P><P>Here you can also find a simplified architecture, that describes the entire scenario in a more generic way:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Enterprise Automation _Learning_Jousssssrney.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221736iD28DB2EB582976D3/image-size/large?v=v2&px=999" role="button" title="Enterprise Automation _Learning_Jousssssrney.jpg" alt="Enterprise Automation _Learning_Jousssssrney.jpg" /></span></P><P> For further guidance, I’ve included links to additional blog posts and resources on the Help Portal that will assist you in implementing these use cases. If you're interested in exploring more scenarios related to Enterprise Automation, feel free to check out the following links:</P><P> </P><UL><LI><SPAN><A href="https://www.sap.com/products/technology-platform/enterprise-automation.html?campaigncode=crm-ya22-int-1517065&source=ppc-de-googleads-search-71700000112010172-58700008741433987-btp_btp-x-x-x&dfa=1&campaigncode=crm-ya22-int-1517065&source=ppc-de-googleads-search-71700000112010172-58700008741433987-btp_btp-x-x-x&dfa=1&gad_source=1&gclid=Cj0KCQiAhbi8BhDIARIsAJLOlucBTfD581QQmTOXJpIyBvCBQji33lBXlXVe-l_G84mlRbwbizdWbL8aAqJBEALw_wcB&gclsrc=aw.ds" target="_blank" rel="noopener noreferrer">Official Enterprise Automation with SAP page</A></SPAN></LI><LI><SPAN>How to get started with <A href="https://community.sap.com/t5/sap-builders-blog-posts/how-to-get-started-with-enterprise-automation/ba-p/13582512" target="_blank">Enterprise Automation Guide</A></SPAN></LI><LI><SPAN><A href="https://www.sap.com/documents/2024/07/b0a21f38-cc7e-0010-bca6-c68f7e60039b.html" target="_blank" rel="noopener noreferrer">Whitepaper: Transition to SAP S/4HANA with Enterprise Automation</A></SPAN></LI><LI><SPAN><A href="https://www.sap.com/products/technology-platform/enterprise-automation/product-tour.html" target="_blank" rel="noopener noreferrer">Enterprise Automation with SAP Product Tour</A></SPAN></LI><LI><SPAN><A href="https://www.sap.com/products/technology-platform/enterprise-automation.html?video=72fb7c18-b57e-0010-bca6-c68f7e60039b" target="_blank" rel="noopener noreferrer">Enterprise Automation with SAP webinar</A></SPAN></LI></UL><P><SPAN>Stay tuned!</SPAN></P><P> </P>2025-02-05T18:22:37.224000+01:00https://community.sap.com/t5/integration-blog-posts/join-the-upcoming-cei-project-in-2025-for-sap-integration-suite/ba-p/14025931Join the upcoming CEI project in 2025 for SAP Integration Suite2025-02-24T14:45:33.895000+01:00alex_bundschuhhttps://community.sap.com/t5/user/viewprofilepage/user-id/45178<P>In this year’s Customer Engagement Initiative (CEI) project for SAP Integration Suite, we will continue collaborating with our customers and partners to gather feedback on product improvements, enhancements and new developments to validate at an early stage, and ensuring that we not only build the right features for your needs but also building it right.</P><P>This will include open discussion about our current product backlogs, roadmap items, addressing pain points and collecting feedback. Some of the core investments which we want to validate in the upcoming CEI project include Gen AI for Integration, move from SAP Process Orchestration to SAP Integration Suite, new adapters, integration in the context of Enterprise Automation, etc.</P><P>If you like to join the upcoming SAP Integration Suite influence project for providing feedback and shaping the SAP Integration Suite product, please <A href="https://influence.sap.com/sap/ino/#campaign/3854" target="_blank" rel="noopener noreferrer">register</A> at the customer influence page.</P><P>Registration is open from 24th of February until 28th of March.</P><P>Once, the registration closes, we will invite you for an initial call where we go through the scope and the prerequisites of the feedback project. This will be around April so that we are able to start the project latest in May this year.</P>2025-02-24T14:45:33.895000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/accessing-sap-graph-odata-v4-through-sap-cloud-integration-cpi/ba-p/14129584Accessing SAP Graph OData V4 through SAP Cloud Integration (CPI)2025-06-19T15:04:44.943000+02:00Aishwarya_Polahttps://community.sap.com/t5/user/viewprofilepage/user-id/2090996<P>This blog explains how to access an SAP Graph OData V4 URL using SAP Cloud Integration (CPI). We will configure the connection, use OAuth 2.0 Client Credentials, and query data using OData parameters.</P><H2 id="toc-hId-1732475516"><SPAN>What is SAP Graph?</SPAN></H2><P><SPAN>SAP Graph is a unified API that provides a simplified, single interface to access data across various SAP systems (like SAP S/4HANA, SAP SuccessFactors, SAP Sales Cloud, etc.). It helps developers interact with complex SAP systems using a consistent API structure, making integration and data access easier.</SPAN></P><H2 id="toc-hId-1535962011">Prerequisites</H2><UL><LI><P>Access to SAP BTP with an SAP Graph instance.</P></LI><LI><P>OAuth 2.0 Client Credentials for SAP Graph.</P></LI><LI><P>SAP Cloud integration with design privileges.</P></LI></UL><H2 id="toc-hId-1339448506"><SPAN>Step 1: Create OAuth 2.0 Credentials</SPAN></H2><OL><LI><P><SPAN>In SAP BTP Cockpit, create your SAP Graph instance.</SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aishwarya_Pola_0-1754387447927.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/296477i73419B8E07C4C331/image-size/large?v=v2&px=999" role="button" title="Aishwarya_Pola_0-1754387447927.png" alt="Aishwarya_Pola_0-1754387447927.png" /></span></P><P> </P></LI><LI><P><SPAN>Create the service key for graph instance . Go to Security material and create OAuth 2.0 client credentials.</SPAN></P></LI><LI><P><SPAN>Note the Client ID and Client Secret.</SPAN></P></LI><LI><P><SPAN>Save the credentials in </SPAN><SPAN><STRONG>Security Material</STRONG></SPAN><SPAN> as a new OAuth2 Client Credentials (e.g., Credential Name: </SPAN><SPAN>GraphOAuthCredentials</SPAN><SPAN>).</SPAN></P></LI></OL><H2 id="toc-hId-1142935001"><SPAN>Step 2: Get the SAP Graph URL</SPAN></H2><OL><LI><P><SPAN>In SAP Integration Suite, navigate to the </SPAN><SPAN><STRONG>Design</STRONG></SPAN><SPAN> section.</SPAN></P></LI><LI><P><SPAN>Inside </SPAN><SPAN><STRONG>Business Data Graph</STRONG></SPAN><SPAN>, you can find the OData V4 URL for your SAP Graph instance.</SPAN></P></LI><LI><P><SPAN>Copy the OData V4 URL (e.g., </SPAN><SPAN>https://<your-graph-url>/graph/api/graphdemo</SPAN><SPAN>).</SPAN></P></LI></OL><H2 id="toc-hId-946421496">Step 3: Configure OData Connection in CPI</H2><OL><LI><P>Log in to SAP CPI, go to Design, and create an Integration Flow.</P></LI><LI><P>Add a Start Timer and a Request Reply step.</P></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aishwarya_Pola_0-1746610838349.png" style="width: 764px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/258404i8EEA39716D701D2E/image-dimensions/764x386?v=v2" width="764" height="386" role="button" title="Aishwarya_Pola_0-1746610838349.png" alt="Aishwarya_Pola_0-1746610838349.png" /></span></P><P> 3. Set connection details:</P><UL><LI><P>Address: <FONT color="#000000">https://<your-graph-url>/graph/api/graphdemo/sap.s4</FONT></P></LI><LI><P>Authentication: OAuth2 Client Credentials</P></LI><LI><P><SPAN>Credential Name: </SPAN><SPAN>GraphOAuthCredentials</SPAN></P></LI></UL><P> </P><H2 id="toc-hId-749907991">Step 4: Set the Resource Path</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aishwarya_Pola_1-1746611173389.png" style="width: 773px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/258405iB0CD32AD6A97A194/image-dimensions/773x417?v=v2" width="773" height="417" role="button" title="Aishwarya_Pola_1-1746611173389.png" alt="Aishwarya_Pola_1-1746611173389.png" /></span></P><P> </P><UL><LI><P>Resource Path: A_SalesOrder</P></LI><LI><P>Query: $select=SalesOrder,SoldToParty&$filter=SalesOrder eq '1'&$expand=_SoldToParty</P></LI></UL><H2 id="toc-hId-553394486">Step 5: Deploy and Test</H2><OL><LI><P>Deploy the integration flow.</P></LI><LI><P>Monitor message processing to verify the response.</P></LI></OL><P><FONT size="5"><STRONG>Conclusion:<BR /></STRONG></FONT><FONT size="3">By following the above steps, you can seamlessly connect SAP Cloud Integration (CPI) with SAP Graph using OAuth 2.0 Client Credentials. This setup allows you to securely access and query data from multiple SAP systems through a unified OData V4 endpoint.</FONT></P>2025-06-19T15:04:44.943000+02:00https://community.sap.com/t5/integration-blog-posts/graph-on-integration-suite-simplifying-multi-api-data-retrieval-with/ba-p/14302711Graph on Integration Suite: Simplifying Multi-API Data Retrieval with Unified Business Data Graph2026-01-09T16:13:06.365000+01:00azhariqbalhttps://community.sap.com/t5/user/viewprofilepage/user-id/869409<P><SPAN><STRONG>Graph</STRONG> is a new and innovative feature of API Management, part of the SAP Integration Suite. Expanding on traditional API Management, Graph allows you to present all your business data as a semantically connected data graph, accessible through a single, unified, and powerful API.</SPAN></P><P><SPAN>SAP Graph is generally available as a core capability within SAP Integration Suite includes the following new features:</SPAN></P><UL><LI><SPAN>A configuration UI for creating business data graphs – an extension of the new Integration Suite configuration UI.</SPAN></LI><LI><SPAN>The ability to extend the built-in Graph data model.</SPAN></LI><LI><SPAN>Graph Navigator (Enterprise Edition) – a tool for exploring and testing queries on your configured business data graphs.</SPAN></LI><LI><SPAN>GraphQL support (in addition to OData v4).</SPAN></LI></UL><P><STRONG><SPAN>Graph Capability in Integration Suite: </SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_0-1767780018922.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358850iFB77C48768FA66FE/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_0-1767780018922.png" alt="azharsd_0-1767780018922.png" /></span></P><P><SPAN>Graph can be used in any SAP Integration Suite plan where API Management is available (including SAP BTP trial accounts), but not necessarily in every region where API Management is available. For more details about the regional availability of Graph, be sure to check out <STRONG><U>SAP Note 3338820</U></STRONG><U>.</U></SPAN></P><P><STRONG><SPAN>Enabling Graph on your Integration Suite</SPAN></STRONG></P><P><STRONG><SPAN>Ensuring the Required Roles and Enabling Graph</SPAN></STRONG></P><OL><LI><SPAN>Make sure you have the <STRONG>Integration Suite Provisioner</STRONG> role.</SPAN></LI><LI><SPAN>Navigate to <STRONG>"Manage Capabilities" → "Add Capabilities"</STRONG> in your Integration Suite home.</SPAN></LI><LI><SPAN>Enable <STRONG>API Management</STRONG> (if not already enabled) through the <STRONG>"Manage APIs"</STRONG> section.</SPAN></LI><LI><SPAN>Enable <STRONG>API Business Hub Enterprise</STRONG> and <STRONG>Graph</STRONG> (API Business Hub Enterprise is mandatory for Graph).</SPAN></LI><LI><SPAN>If <STRONG>Graph</STRONG> is not visible, refer to <STRONG><U>SAP Note 3338820</U></STRONG>, as it may not be supported in your region.</SPAN></LI><LI><SPAN>Select <STRONG>"Enable API Business Hub Enterprise"</STRONG> and <STRONG>"Graph"</STRONG> to complete the setup.</SPAN></LI></OL><P><STRONG><SPAN>Note:</SPAN></STRONG><SPAN> Graph requires <STRONG>SAP API Management</STRONG> to be activated.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_1-1767780018932.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358852i48170E6B180E0B97/image-size/medium?v=v2&px=400" role="button" title="azharsd_1-1767780018932.png" alt="azharsd_1-1767780018932.png" /></span></P><P><STRONG><SPAN>Assigning Roles for Graph</SPAN></STRONG></P><P><SPAN>Once <STRONG>Graph</STRONG> is enabled, you will see two additional <STRONG>Role Collections</STRONG> in the SAP BTP Cockpit:</SPAN></P><UL><LI><STRONG><SPAN>Graph.KeyUser</SPAN></STRONG><SPAN> – A role for Graph Developers to define <STRONG>Business Data Graphs (BDGs)</STRONG>.</SPAN></LI><LI><STRONG><SPAN>GraphNavigator.Viewer</SPAN></STRONG><SPAN> – A role for viewing graphs in <STRONG>Graph Navigator</STRONG>.</SPAN></LI></UL><P><SPAN>To proceed, go to your <STRONG>SAP BTP Cockpit</STRONG> and assign these <STRONG>Role Collections</STRONG> to your user.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_2-1767780018937.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358851i01DB9597C2D1B06F/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_2-1767780018937.png" alt="azharsd_2-1767780018937.png" /></span></P><P><SPAN>Note the term:<STRONG> Business Data Graphs. </STRONG>SAP refers to Graphs as BDGs or Business Data Graphs in their documentation.</SPAN></P><P><SPAN>That's it, you are all set for Configuring BDGs or Business Data Graphs! <STRONG><EM>Logout </EM></STRONG>and <STRONG><EM>Log back</EM></STRONG> on Integration Suite and you will now see Graphs Enabled in Integration Suite under Design Tab.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_3-1767780018939.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358853i59F72D67CFE3DE0A/image-size/medium?v=v2&px=400" role="button" title="azharsd_3-1767780018939.png" alt="azharsd_3-1767780018939.png" /></span></P><P> </P><P><STRONG><SPAN>Enable SAP Graph Entitlement on BTP Subaccount</SPAN></STRONG></P><P><SPAN>In below screenshot Graph entitlement is enabled</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_4-1767780018945.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358855i1DFBFEB9AE8ED8AD/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_4-1767780018945.png" alt="azharsd_4-1767780018945.png" /></span></P><P><SPAN>To enable <STRONG>SAP Graph (Business Data Graphs - BDGs)</STRONG> in your <STRONG>BTP Subaccount</STRONG>, follow these steps:</SPAN></P><OL><LI><SPAN>Navigate to your <STRONG>BTP Subaccount</STRONG>.</SPAN></LI><LI><SPAN>Go to <STRONG>Entitlements</STRONG> → <STRONG>Configure Entitlements</STRONG>.</SPAN></LI><LI><SPAN>Click <STRONG>"Add Service Plans"</STRONG>.</SPAN></LI><LI><SPAN>Select <STRONG>SAP Graph</STRONG> and choose the <STRONG>api</STRONG> service plan.</SPAN></LI><LI><SPAN>Save your changes to apply the entitlement.</SPAN></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_5-1767780018955.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358854i8E663EAFD0C0FC0E/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_5-1767780018955.png" alt="azharsd_5-1767780018955.png" /></span></P><P><STRONG><SPAN>Creating a Service Instance for SAP Graph</SPAN></STRONG></P><OL><LI><SPAN>Go to your <STRONG>BTP Subaccount</STRONG>.</SPAN></LI><LI><SPAN>Navigate to <STRONG>Services</STRONG> → <STRONG>Instances and Subscriptions</STRONG>.</SPAN></LI><LI><SPAN>Click <STRONG>"Create"</STRONG> and select <STRONG>SAP Graph</STRONG> as the service.</SPAN></LI><LI><SPAN>Choose the <STRONG>api</STRONG> plan.</SPAN></LI><LI><SPAN>Provide a name for your service instance.</SPAN></LI><LI><SPAN>Click <STRONG>"Create"</STRONG> to finalize the setup.</SPAN></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_6-1767780018966.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358856iF51C224A64D356E0/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_6-1767780018966.png" alt="azharsd_6-1767780018966.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_7-1767780018968.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358857i4DCDF0FAD1A07CEA/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_7-1767780018968.png" alt="azharsd_7-1767780018968.png" /></span></P><P><STRONG><SPAN>Creating a Service Key for SAP Graph</SPAN></STRONG></P><OL><LI><SPAN>Go to your <STRONG>BTP Subaccount</STRONG>.</SPAN></LI><LI><SPAN>Navigate to <STRONG>Services</STRONG> → <STRONG>Instances and Subscriptions</STRONG>.</SPAN></LI><LI><SPAN>Find the <STRONG>SAP Graph</STRONG> service instance you created in the previous step.</SPAN></LI><LI><SPAN>Click on the instance and select <STRONG>"Create Service Key"</STRONG>.</SPAN></LI><LI><SPAN>Provide a name for the service key and click <STRONG>"Create"</STRONG>.</SPAN></LI><LI><SPAN>Once generated, <STRONG>copy and save the Service Key</STRONG>, as it will be required for exploring <STRONG>Business Data Graphs (BDGs)</STRONG> using <STRONG>Postman</STRONG>.</SPAN></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_8-1767780018971.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358858i653A53F6685FA2D5/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_8-1767780018971.png" alt="azharsd_8-1767780018971.png" /></span></P><P><SPAN>The Graph instance is created and Binded with its Service Key:</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_9-1767780018974.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358860i235D7B93F329DFC5/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_9-1767780018974.png" alt="azharsd_9-1767780018974.png" /></span></P><P><SPAN>Once your <STRONG>Service Key</STRONG> is created, make sure to note the following details:</SPAN></P><UL><LI><STRONG><SPAN> clientid</SPAN></STRONG><SPAN> – Required for authentication.</SPAN></LI><LI><STRONG><SPAN> clientsecret</SPAN></STRONG><SPAN> – Used for authentication along with the client ID.</SPAN></LI><LI><STRONG><SPAN> url</SPAN></STRONG><SPAN> – This is the <STRONG>Token URL</STRONG> used to obtain authentication tokens.</SPAN></LI><LI><STRONG><SPAN>uri</SPAN></STRONG><SPAN> – Contains the <STRONG>hostname</STRONG>, which includes the <STRONG>GraphQL Endpoint hostname</STRONG> for accessing Business Data Graphs (BDGs).</SPAN></LI></UL><P><SPAN>You'll need these details when exploring <STRONG>BDGs</STRONG> using <STRONG>Postman</STRONG> or any API client.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_10-1767780018981.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358859i13F28C1583ADE2C9/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_10-1767780018981.png" alt="azharsd_10-1767780018981.png" /></span></P><P><SPAN> </SPAN><STRONG><SPAN>Graph Creation</SPAN></STRONG></P><P><STRONG><SPAN>Fetch Sales Order Details with Customer Details</SPAN></STRONG></P><P><SPAN>Imagine a S/4Hana System, where you have a <STRONG>BusinessPartner API </STRONG>and<STRONG> SalesOrder API</STRONG> exposed. This could be a S/4Hana On-Premises System or a S/4Hana Public Cloud Edition System. These are classic ODATA APIs from SAP – <A href="https://api.sap.com/api/API_BUSINESS_PARTNER/overview" target="_blank" rel="noopener noreferrer">Business Partner ODATA API</A> and <A href="https://api.sap.com/api/API_SALES_ORDER_SRV/overview" target="_blank" rel="noopener noreferrer">Sales Order ODATA API</A>.</SPAN></P><P><STRONG><EM><SPAN>Note: In my case I’m using SAP Business Accelerator Hub – API HUB </SPAN></EM></STRONG></P><P><STRONG><SPAN>Querying Sales Orders and Customer Details with SAP Graph</SPAN></STRONG></P><P><SPAN>In a <STRONG>typical integration scenario</STRONG>, querying <STRONG>Sales Orders</STRONG> from <STRONG>SAP S/4HANA</STRONG> and fetching <STRONG>Customer Details (SoldToParty)</STRONG> involves:</SPAN></P><OL><LI><STRONG><SPAN>Making an OData GET request</SPAN></STRONG><SPAN> to the <STRONG>Sales Order API</STRONG> to retrieve Sales Order details.</SPAN></LI><LI><STRONG><SPAN>Making another OData GET request</SPAN></STRONG><SPAN> to the <STRONG>Business Partner API</STRONG> to fetch the corresponding <STRONG>SoldToParty</STRONG> details.</SPAN></LI><LI><STRONG><SPAN>Enriching the data</SPAN></STRONG><SPAN> using <STRONG>SAP Cloud Integration</STRONG> to combine the two datasets.</SPAN></LI></OL><P><SPAN>Since SAP provides this information through <STRONG>two separate APIs</STRONG>, this approach traditionally requires <STRONG>two API calls</STRONG> and additional processing to merge the data. However, with <STRONG>SAP Graph (BDGs - Business Data Graphs)</STRONG>, you can simplify this by using a <STRONG>single GraphQL query</STRONG> to fetch Sales Orders and their associated Customer details in one call.</SPAN></P><P><STRONG><SPAN>Simplifying Data Retrieval with SAP Graph</SPAN></STRONG></P><P><SPAN>Traditionally, in <STRONG>SAP Cloud Integration</STRONG>, fetching <STRONG>Sales Order</STRONG> details along with <STRONG>SoldToParty (Customer Details)</STRONG> from <STRONG>S/4HANA Cloud</STRONG> requires:</SPAN></P><UL><LI><STRONG><SPAN>Multiple OData API calls</SPAN></STRONG><SPAN> (one for Sales Orders, one for Business Partners).</SPAN></LI><LI><STRONG><SPAN>Content Enrichers</SPAN></STRONG><SPAN> to merge and process the data.</SPAN></LI><LI><STRONG><SPAN>Lookups</SPAN></STRONG><SPAN> to fetch related information across different API endpoints.</SPAN></LI></UL><P><SPAN>This is a <STRONG>common challenge</STRONG> when integrating SAP and non-SAP <STRONG>SaaS applications</STRONG>.</SPAN></P><P><STRONG><SPAN>The Power of SAP Graph (BDGs - Business Data Graphs)</SPAN></STRONG></P><P><SPAN>With <STRONG>SAP Graph on Integration Suite</STRONG>, you can retrieve all this data in <STRONG>one API call</STRONG>—with <STRONG>no custom development</STRONG>!</SPAN></P><P><SPAN>SAP Graph introduces the concept of <STRONG>Mirrored Entities</STRONG>, which allows you to:</SPAN></P><UL><LI><SPAN>Access data from <STRONG>multiple APIs as a single, unified data model</STRONG>.</SPAN></LI><LI><SPAN>Query related entities (e.g., Sales Orders and SoldToParty) <STRONG>in a single request</STRONG>.</SPAN></LI><LI><SPAN>Reduce integration complexity and <STRONG>eliminate the need for multiple lookups/enrichers</STRONG>.</SPAN></LI></UL><P><STRONG><SPAN>What’s Next?</SPAN></STRONG></P><P><SPAN>We’ll explore <STRONG>Mirrored Entities</STRONG> in SAP Graph and see how they can <STRONG>simplify</STRONG> fetching <STRONG>Sales Order details</STRONG> along with <STRONG>Customer details</STRONG> from an <STRONG>Business Accelerator Hub—all in one call</STRONG>.</SPAN></P><P><STRONG><SPAN>Creating Destinations on SAP BTP</SPAN></STRONG></P><P><SPAN>To integrate SAP Graph with your <STRONG>S/4HANA Cloud</STRONG> or <STRONG>On-Premise</STRONG> system, you need to create destinations on your <STRONG>BTP Subaccount</STRONG>.</SPAN></P><P><STRONG><SPAN>Prerequisites</SPAN></STRONG></P><UL><LI><SPAN>You have your <STRONG>OData API endpoint</STRONG> for <STRONG>Sales Orders</STRONG> and <STRONG>Business Partners</STRONG>.</SPAN></LI><LI><SPAN>A <STRONG>Technical Communication User</STRONG> is set up with the required roles and permissions to access these APIs.</SPAN></LI></UL><P><STRONG><SPAN>Steps to Create Destinations in BTP</SPAN></STRONG></P><OL><LI><STRONG><SPAN>Navigate to BTP Cockpit</SPAN></STRONG></LI><UL><LI><SPAN>Go to your <STRONG>BTP Subaccount</STRONG> where <STRONG>Integration Suite / Graph</STRONG> is running.</SPAN></LI><LI><SPAN>Open the <STRONG>Destinations</STRONG> section.</SPAN></LI></UL><LI><STRONG><SPAN>Create a Destination for Sales Orders API</SPAN></STRONG></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_11-1767780018983.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358861i9D8ECB7BA439225C/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_11-1767780018983.png" alt="azharsd_11-1767780018983.png" /></span></P><OL><LI><STRONG><SPAN>Create a Destination for Business Partner API</SPAN></STRONG></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_12-1767780018985.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358862iF2B0BEFA77B68A7F/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_12-1767780018985.png" alt="azharsd_12-1767780018985.png" /></span></P><P><STRONG><SPAN>Setting Up a Business Data Graph in Integration Suite</SPAN></STRONG></P><P><SPAN>Next, we’ll create a <STRONG>Business Data Graph (BDG)</STRONG> in <STRONG>SAP Integration Suite</STRONG>. To get started, go to <STRONG>Integration Suite → Design → Graph</STRONG>.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_13-1767780018989.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358863iB90F209E08141FAF/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_13-1767780018989.png" alt="azharsd_13-1767780018989.png" /></span></P><P><SPAN>Once destination as source are added, click next, review the configurations, below screen will appear in a while after processing </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_14-1767780018993.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358864i3AC13E37BADA31ED/image-size/medium?v=v2&px=400" role="button" title="azharsd_14-1767780018993.png" alt="azharsd_14-1767780018993.png" /></span></P><P><SPAN>Click on Activate.</SPAN></P><P><STRONG>Test Your Graph on Graph Navigator</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_15-1767780018999.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358866iF0D798F5398E9701/image-size/medium?v=v2&px=400" role="button" title="azharsd_15-1767780018999.png" alt="azharsd_15-1767780018999.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_16-1767780019003.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358867i0D53F17CDA70A1F8/image-size/medium?v=v2&px=400" role="button" title="azharsd_16-1767780019003.png" alt="azharsd_16-1767780019003.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_17-1767780019007.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358865i91A69CD2750784D6/image-size/medium?v=v2&px=400" role="button" title="azharsd_17-1767780019007.png" alt="azharsd_17-1767780019007.png" /></span></P><P> </P><P><STRONG><SPAN>Validating Graph OData API</SPAN></STRONG></P><P><SPAN>As discussed earlier, all <STRONG>Business Data Graphs (BDGs)</STRONG> created in <STRONG>SAP Integration Suite</STRONG> are accessible via <STRONG>OData V4 APIs</STRONG>, as documented in SAP's official guides.</SPAN></P><P><SPAN>Now, we’ll use the <STRONG>Service Key</STRONG> generated in the previous step to obtain an <STRONG>OAuth token</STRONG> and authenticate our request to test the <STRONG>Graph OData API</STRONG>.</SPAN></P><P><STRONG><SPAN>Note the URI in your Service Key has the format</SPAN></STRONG></P><P><SPAN>https://<subdomain>.a.integration.cloud.sap/graph/api</SPAN></P><P><STRONG><SPAN>List all BDGs</SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_18-1767780019015.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358868iF3B992AE3D07A40B/image-size/medium?v=v2&px=400" role="button" title="azharsd_18-1767780019015.png" alt="azharsd_18-1767780019015.png" /></span></P><P><SPAN> </SPAN><STRONG><SPAN>List all Services of a BDG (namespace)</SPAN></STRONG></P><P><SPAN>List all namespaces of a Specific BDG. Namespaces can be sap.s4, sap.graph, <STRONG>sap.hcm</STRONG> and so on.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_19-1767780019022.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358869i1F5E0B5E81DB9135/image-size/medium?v=v2&px=400" role="button" title="azharsd_19-1767780019022.png" alt="azharsd_19-1767780019022.png" /></span></P><P><STRONG><SPAN>List all Entities in a namespace in a BDG</SPAN></STRONG></P><P><SPAN>Entities of a Graph can be displayed using below</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_20-1767780019028.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358870i15816932E8FE019F/image-size/medium?v=v2&px=400" role="button" title="azharsd_20-1767780019028.png" alt="azharsd_20-1767780019028.png" /></span></P><P><STRONG><SPAN>Get Metadata of a Service (Namespace)</SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_21-1767780019036.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358873iFA94CEB9CBDC6953/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_21-1767780019036.png" alt="azharsd_21-1767780019036.png" /></span></P><P><STRONG><SPAN>Test our Service to get Sales Order Details with SoldToParty</SPAN></STRONG></P><P><SPAN>In our example this will be in below format</SPAN></P><UL><LI><SPAN>Use _SoldToParty for expanding SoldToParty ( note the “underscore”). Thats the standard Graph Notation when you have automatic associations built ( from Sales Order to Business Partner API in our case )</SPAN></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_22-1767780019040.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358872i5F0028C554DA1CC8/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="azharsd_22-1767780019040.png" alt="azharsd_22-1767780019040.png" /></span></P><P><SPAN>That's it! We have successfully invoked your <STRONG>Graph OData V4 API</STRONG> and retrieved <STRONG>Sales Order data </STRONG>enriched with<STRONG> Business Partner details</STRONG>.</SPAN></P><P><SPAN>What would typically require a <STRONG>two-step process</STRONG> using a <STRONG>Content Enricher</STRONG> in <STRONG>Cloud Integration</STRONG> is now streamlined into a <STRONG>single API call</STRONG>—thanks to <STRONG>Graph on Integration Suite</STRONG>. </SPAN></P><P><SPAN> </SPAN><SPAN>SAP Graph has the below <STRONG>GraphQL</STRONG> endpoint :</SPAN></P><P><SPAN>https://<subdomain>.a.integration.cloud.sap/graph/api/<bdg>/graphql</SPAN></P><P><SPAN> </SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="azharsd_23-1767780019044.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358871i285E9B17C6B34772/image-size/medium?v=v2&px=400" role="button" title="azharsd_23-1767780019044.png" alt="azharsd_23-1767780019044.png" /></span></P><P> </P>2026-01-09T16:13:06.365000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/use-rest-services-in-graph/ba-p/14311245Use REST services in Graph2026-01-20T16:41:34.615000+01:00florian_moritzhttps://community.sap.com/t5/user/viewprofilepage/user-id/748729<P>Hello!</P><P>In this part of the tutorial on Graph we will focus on the support of REST services in Graph. For an overview of other parts of this series, check out the <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/information-map-introduction-series-graph-in-sap-integration-suite/ba-p/13614448" target="_self">Information Map</A>.</P><H2 id="toc-hId-1788568963">REST support in Graph</H2><P>Graph enables the use of REST services as data sources for business data graphs (BDGs). Compared to OData data sources, there are some key differences:</P><UL><LI>The<SPAN> </SPAN><EM>metadata</EM><SPAN> </SPAN>that describes the service must be provided separately along with the service endpoint in the OpenAPI format.</LI><LI>OpenAPI does not have the concept of<SPAN> </SPAN><EM>entities</EM><SPAN> </SPAN>like OData does. Instead, it focuses on operations, which are represented as<SPAN> </SPAN><EM>actions and functions</EM><SPAN> </SPAN>in a BDG.</LI></UL><P>We will now explain how these differences are being handled by Graph in more detail:</P><H3 id="toc-hId-1721138177">Metadata for a REST service</H3><P>REST services are commonly described using the OpenAPI format, which outlines the operations and resources available in the service. Unlike OData, which provides a<SPAN> </SPAN><CODE>$metadata</CODE><SPAN> </SPAN>endpoint for accessing service metadata, plain REST services do not have a standard way to access this information. Since Graph requires metadata to work with REST services, users must provide this metadata when setting up a business data graph.</P><P>Graph uses BTP destinations to define access to data sources. To use a REST service as data source, users need to create 2 destinations:</P><UL><LI>a data destination: that points to the actual REST service</LI><LI>a metadata destination: where the OpenAPI metadata document for the REST service can be retrieved</LI></UL><P>Both destinations also need annotations that connect them together, so that Graph can understand which metadata destination belongs to which REST service destination.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="destination-setup.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363424i2AF14413A6F0C34D/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="destination-setup.png" alt="destination-setup.png" /></span></P><H3 id="toc-hId-1524624672">Data Model</H3><P>Graph exposes a unified API endpoint for the OData and GraphQL protocols. Both offer an entity (or type/object) model in which data can be represented. Plain REST as described by OpenAPI does not have a strict entity model, and services are defined as different operations. For example, an operation might be to 'find a pet by name' or 'retrieve pets of a store' in a pet-store service. However, to expose these REST-operations as valid OData in the unified API, Graph transforms them into unbound OData operations (actions & functions) in the BDG. We refer to these also as mirrored operations, similar to mirrored entities. As part of that transformation, some changes are made to the signature of the operations to align with the OData standard. These include:</P><UL><LI>all paths are flattened: for example a<SPAN> </SPAN><CODE>GET /users/pets</CODE><SPAN> </SPAN>is transformed to a<SPAN> </SPAN><CODE>GET users_pets</CODE><SPAN> </SPAN>in the BDG</LI><LI>all methods are standardized to GET and POST, with the underlying method being appended to the operation name: for example a<SPAN> </SPAN><CODE>DELETE /users/pets</CODE><SPAN> </SPAN>becomes a<SPAN> </SPAN><CODE>POST /users_pets__delete</CODE></LI></UL><H2 id="toc-hId-1199028448">Example</H2><P>Having explained the main concepts of REST support in Graph, let's now look at a practical example. We will take the try-out sandbox of this SAP Ariba<SPAN> </SPAN><A href="https://api.sap.com/api/network_catalog_mgmt/overview" target="_self" rel="noopener noreferrer">Network Catalog Management</A><SPAN> </SPAN>REST service and use it in a BDG. You can also download the OpenAPI metadata document for the service there under API Resources / API specification.</P><H3 id="toc-hId-1131597662">Tutorial Setup</H3><P>Before we can use the SAP Ariba service in a BDG, we need to setup the two destinations in SAP BTP.</P><P>Prerequisites:</P><UL><LI>SAP Integration Suite with API Management and Graph enabled</LI><LI>Access to destinations and service instances in SAP BTP cockpit</LI></UL><H4 id="toc-hId-1064166876">Data Destination</H4><P>Open the SAP BTP Cockpit and create a new destination from scratch in the BTP subaccount where you have Graph and SAP Integration Suite. Enter the following details</P><UL><LI>Name:<SPAN> </SPAN><CODE>ariba-network-catalog-mgmt</CODE></LI><LI>URL:<SPAN> </SPAN><CODE><A href="https://sandbox.api.sap.com/ariba/api/network-catalog-mgmt/v1/sandbox" target="_blank" rel="noopener noreferrer">https://sandbox.api.sap.com/ariba/api/network-catalog-mgmt/v1/sandbox</A></CODE></LI></UL><P>Also add these two additional properties to the destination:</P><UL><LI>Key:<SPAN> </SPAN><CODE>Graph.destinationType</CODE><SPAN> </SPAN>with the value:<SPAN> </SPAN><CODE>REST</CODE>. This declares this destination as a REST data destination to Graph.</LI><LI>Key:<SPAN> </SPAN><CODE>URL.headers.apiKey</CODE><SPAN> </SPAN>with the value:<SPAN> </SPAN><CODE><your sandbox API key></CODE><SPAN> </SPAN>to add your sandbox API key for authentication purposes (this only applies to this sandbox-example). You can retrieve your API key here:<SPAN> </SPAN><A href="https://api.sap.com/settings" target="_blank" rel="noopener noreferrer">https://api.sap.com/settings</A>.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="1-data-destination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363437i993BB8326697EBE8/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="1-data-destination.png" alt="1-data-destination.png" /></span></P><P class="lia-align-center" style="text-align: center;"><EM>data destination in BTP cockpit</EM></P><H4 id="toc-hId-867653371">Metadata Destination</H4><P>Next, we need to define the metadata destination that points to a location where Graph can access the OpenAPI metadata document. This could be done in a number of ways by hosting this file in a file-server/document storage or at a custom service endpoint for example. For sake of keeping this tutorial simple we will only use SAP Integration Suite to make this file available to Graph: we will create an API artifact which returns the content of the OpenAPI metadata file and then create the metadata destination that points towards the endpoint of that API artifact. Note that this is only for the purposes of this tutorial, and not a requirement.</P><H5 id="toc-hId-800222585">Hosting the OpenAPI file with an API artifact (optional, only for the tutorial)</H5><P><SPAN>First we create the API artifact in SAP Integration Suite. Open Integration Suite and go to Design > Integrations and APIs. Choose an existing package or create a new one. In the package click Edit and open the Artifacts tab. Now you can select Add > API in the table menu. Follow the API creation dialog and select </SPAN><CODE>REST API</CODE><SPAN> as API Type, </SPAN><CODE>Create</CODE><SPAN> as Method and then give it the following name: </SPAN><CODE>Ariba-Network-Catalog-OpenAPI</CODE><SPAN>. Open the created API and in the 'Handle Request' lane select the 'Content Modifier' step. In the bottom UI panel you will then see the Message Body tab where we can paste a constant body this API should return. Here, we will paste the JSON content of the OpenAPI specification of the service (available </SPAN><A href="https://api.sap.com/api/network_catalog_mgmt/overview" target="_blank" rel="noopener noreferrer">here</A><SPAN>). If you have other APIs in the tenant you might also want to assign a unique path for this API. To do that select the HTTPS arrow outgoing from the Start participant, and then in the bottom UI panel you can edit the 'Connection' and change the path in the 'Address' field. Here, we are using </SPAN><CODE>/ariba-network-catalog-openapi</CODE><SPAN>. Then save the API artifact and deploy it. You can check the deployment status under Monitor > Integrations and APIs > Manage Integration Content: All. When it is deployed, the OpenAPI document will be available at that endpoint. Copy the endpoint URL for later.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2-message-body.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363439iCE848016268A2671/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="2-message-body.png" alt="2-message-body.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>constant message body returns the OPenAPI spec JSON</EM></SPAN></P><P> </P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="3-https-connection-address.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363438iE381D2CA0E36C2C4/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="3-https-connection-address.png" alt="3-https-connection-address.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>unique path for this API artifact</EM></SPAN></P><P> </P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="4-monitor.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363440i82A009E49BB720EC/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="4-monitor.png" alt="4-monitor.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>monitoring view of the deployed API artifact, with the endpoint URL</EM></SPAN></P><P><SPAN>To access that endpoint in a destination, we also need the authentication details. Here, we want to authenticate using OAuth client credentials that we obtain from a SAP Process Integration Runtime. For that, go to BTP Cockpit and under Services > Instances and Subscriptions you can find it or create a new one. Then create a Service Key for that instance. We now have a set of client credentials we need for authentication: namely the </SPAN><CODE>clientid</CODE><SPAN>, </SPAN><CODE>clientsecret</CODE><SPAN> and </SPAN><CODE>tokenurl</CODE><SPAN>.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="5-process-integration-runtime.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363441i4FD2784F0DE47366/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="5-process-integration-runtime.png" alt="5-process-integration-runtime.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>process integration runtime with a service key in BTP cockpit</EM> </SPAN></P><H5 id="toc-hId-603709080">Creating the Destination</H5><P>Now we can create the Metadata destination. Enter the following details:</P><UL><LI>Name:<SPAN> </SPAN><CODE>ariba-network-catalog-mgmt-openapi</CODE></LI><LI>URL: the API artifact endpoint URL from above</LI><LI>Authentication:<SPAN> </SPAN><CODE>OAuth2ClientCredentials</CODE></LI><LI>Client ID: <CODE>clientid</CODE><SPAN> </SPAN>from above</LI><LI>Client Secret: <CODE>clientsecret</CODE><SPAN> </SPAN>from above</LI><LI>Token Service URL: <CODE>tokenurl</CODE><SPAN> </SPAN>from above</LI></UL><P>We will also annotate this destination with additional properties, to tell Graph that this is the metadata destination for the previously created<SPAN> </SPAN><CODE>ariba-network-catalog-mgmt</CODE><SPAN> </SPAN>destination:</P><UL><LI>Key:<SPAN> </SPAN><CODE>Graph.destinationType</CODE>, with a value of<SPAN> </SPAN><CODE>OpenAPI</CODE></LI><LI>Key:<SPAN> </SPAN><CODE>Graph.metadataFor</CODE>, with a value of<SPAN> </SPAN><CODE>ariba-network-catalog-mgmt</CODE></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="6-metadata-destination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363442iA61F1C1F4BBA0F58/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="6-metadata-destination.png" alt="6-metadata-destination.png" /></span></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>metadata destination</EM></SPAN></P><P><SPAN>Now the destination setup is complete and we can create a BDG.</SPAN></P><H3 id="toc-hId-149030137">Creating the BDG with REST data sources</H3><P><SPAN>With the data destination and the metadata destination created, we can now continue to create a BDG with the REST service. The process does not differ much in this case. In Integration Suite under Design > Graph, create a new Business Data Graph with the ID </SPAN><CODE>rest-bdg</CODE><SPAN>. In the list of destinations, you can now see an </SPAN><CODE>ariba-network-catalog-mgmt</CODE><SPAN> entry with the type REST. The info icon shows you more details, for example that Graph has identified which metadata destination belongs to this entry. Just select the entry and continue. When the dialog is finished and we see a preview of the BDG details, we can also change the namespace of the data source from </SPAN><CODE>my.custom</CODE><SPAN> to </SPAN><CODE>my.ariba</CODE><SPAN> (this is optional). Continue by activating the BDG.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="7-create-bdg.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363448i80A2795CE63CD055/image-size/large?v=v2&px=999" role="button" title="7-create-bdg.png" alt="7-create-bdg.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><EM>data source selection when creating a new BDG</EM></P><P> </P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="8-rename-namespace.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363446i47951F418ED1874C/image-size/large?v=v2&px=999" role="button" title="8-rename-namespace.png" alt="8-rename-namespace.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>editing the namespace of a data source</EM></SPAN></P><P> </P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="9-bdg-overview.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363447iBC70A2F3BA4B08FD/image-size/large?v=v2&px=999" role="button" title="9-bdg-overview.png" alt="9-bdg-overview.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><EM>overview of the activated BDG</EM></P><H3 id="toc-hId--122714737"><SPAN>Making Queries against the BDG</SPAN></H3><P>With the BDG activated, we can now inspect the mirrored operations. Open the BDG in Developer Hub (there is a link on the overview tab of the BDG). You will see the following operations:</P><UL><LI><CODE>GET products</CODE><SPAN> </SPAN>(mirrored from<SPAN> </SPAN><CODE>GET /products</CODE>)</LI><LI><CODE>GET products_</CODE><SPAN> </SPAN>(mirrored from<SPAN> </SPAN><CODE>GET /products/{productid}</CODE>)</LI><LI><CODE>POST products__delete</CODE><SPAN> </SPAN>(mirrored from<SPAN> </SPAN><CODE>DELETE /products/{productid}</CODE>)</LI><LI><CODE>POST products__patch</CODE><SPAN> </SPAN>(mirrored from<SPAN> </SPAN><CODE>PATCH /products/{productid}</CODE>)</LI><LI><CODE>POST products_post</CODE><SPAN> </SPAN>(mirrored from<SPAN> </SPAN><CODE>POST /products</CODE>)</LI></UL><P>The<SPAN> </SPAN><CODE>productid</CODE><SPAN> </SPAN>path parameter here is either transformed into an unbound function path parameter, or an unbound action body parameter in this example. This illustrates the transformation that Graph makes of the mirrored operations into valid OData operations as mentioned earlier. In the try out tab we can see all the parameters of the operation and also give it a go.</P><P><STRONG><CODE>Note: Graph treats all parameters of mirrored operations as required at this time. However, you can set the value to null.</CODE></STRONG></P><DIV class=""><DIV class=""> </DIV><DIV class=""><SPAN>This SAP Ariba sandbox API requires an </SPAN><CODE>X_ARIBA_NETWORK_ID</CODE><SPAN> parameter. You can use the value </SPAN><CODE>AN02005777309</CODE><SPAN> for this sandbox. When running the </SPAN><CODE>my.ariba/products</CODE><SPAN> operation, we can see that we get the response from the REST service in a valid OData format.</SPAN></DIV><DIV class=""> </DIV><DIV class=""><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="10-developer-hub.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363450i32300E243B0C78B5/image-size/large?v=v2&px=999" role="button" title="10-developer-hub.png" alt="10-developer-hub.png" /></span></SPAN></DIV><DIV class="lia-align-center" style="text-align: center;"><EM>trying out the mirrored functions in Developer Hub (Graph Navigator)</EM></DIV></DIV><H2 id="toc-hId--25825235">Summary</H2><P>In this tutorial we had a look at how REST services can be used as data sources in a business data graph. With this feature, you can integrate data from REST services alongside data from OData services into a single unified Graph API.</P><P>You can learn more about REST-support in Graph in the documentation:</P><UL><LI><A href="https://help.sap.com/docs/graph/graph/rest-services-as-data-sources" target="_blank" rel="noopener noreferrer">REST services as data sources</A></LI><LI><A href="https://help.sap.com/docs/graph/graph/rest-services" target="_blank" rel="noopener noreferrer">Connect to your business systems: REST services</A></LI></UL><P>--</P><P><STRONG>Florian Moritz</STRONG></P>2026-01-20T16:41:34.615000+01:00https://community.sap.com/t5/integration-blog-posts/announcement-register-to-the-new-cei-project-for-sap-integration-suite-in/ba-p/14321718Announcement: Register to the new CEI project for SAP Integration Suite in 20262026-02-09T08:33:34.010000+01:00alex_bundschuhhttps://community.sap.com/t5/user/viewprofilepage/user-id/45178<P>Like in the previous years, we will run a <STRONG>Global Customer Engagement Initiative (CEI) for SAP Integration Suite</STRONG> also in 2026.</P><P>Last year, we had 180+ registered customers and partners from over 20 countries worldwide. We ran multiple feedback sessions covering various capabilities and strategic investment topics of SAP Integration Suite such as "SAP Process Orchestration move" (ABAP proxy generation, mass migration, migration assessment, migration agent, etc.), AI & gen AI in the context of SAP Integration Suite in general and for B2B in particular, monitoring and operations, new adapters and adapter enhancements, reusable APIs and governance of API key access, event driven architecture, etc.</P><P>In 2026, we will continue collaborating with our customers and partners to gather feedback on product improvements, enhancements and new developments to validate the planned enhancements at an early stage, and ensuring that what we build will meet your business needs.</P><P>This will include open discussion about our current product backlog from the <A href="https://roadmaps.sap.com/board?PRODUCT=000D3A47875C1EDB98A8A910864AC24B" target="_blank" rel="noopener noreferrer">roadmap explorer</A> as well as addressing pain points and topics that we collected in last year's CEI project such as more on Edge Integration Cell, AI, SAP PI/PO to SAP Integration Suite migration, Event Driven Architecture, ISA-M, best practices and guidelines, developer experience, etc. </P><P data-unlink="true">If you like to join the upcoming SAP Integration Suite influence project for providing feedback and shaping the SAP Integration Suite product, please<SPAN> </SPAN><A href="https://influence.sap.com/sap/ino/#campaign/4124" target="_blank" rel="noopener noreferrer">register here</A><SPAN> (link leads to the </SPAN>customer influence page).</P><P><STRONG>Registration is open from 9th of February 2026 until 13th of March 2026.</STRONG></P><P>Once, the registration closes, we will invite you for an initial call where we go through the scope and the prerequisites of the feedback project. This will be around end of March/ begin of April so that we are able to start the project latest in April this year.</P><P>We will run monthly feedback sessions through the end of the year and hold a closing call to summarize our learnings, review the feedback collected, and discuss next steps.</P><P>Register today to ensure you do not miss this opportunity to influence and contribute to shaping <STRONG>SAP Integration Suite</STRONG> to meet your business needs. </P><P>We look forward to your active participation and valuable feedback.</P><P> </P>2026-02-09T08:33:34.010000+01:00