HomeDev GuideRecipesAPI Reference
Dev GuideAPI ReferenceUser GuideLegal TermsGitHubNuGetDev CommunityOptimizely AcademySubmit a ticketLog In
Dev Guide

Visual Builder queries

Describes how to query for Visual Builder compositions in Content Management System (CMS) (SaaS) using Optimizely Graph.

Visual Builder is a way of composing content and layout. See Visual Builder for information. When an experience is indexed in Optimizely, the layout and the data parts are merged into a composition model.

Graph schema

A composition is a structure of CompositionNode instance.

CompositionNode

CompositionNode is the base type for nodes in the composition structure. The Optimizely Graph schema for CompostitionNode is defined as:

PropertyTypeDescription
typeStringSpecifies the corresponding content type for nodes with a corresponding content type. For example BlankExperience, BlankSection, ImageElement, TextElement, and so on).
nodeTypeStringSpecifies the type of node. Values are typically experience, section, row, column and element.
displayNameStringThe displayName for the node.
keyStringA unique key for the node within the experience.
displayTemplateKeyStringOptional key specifying which Display Template is used by the node (if any).
displaySettings[CompositionDisplaySetting]An array of display settings that are defined for the node.

CompositionStructureNode

A subtype to CompositionNode that represents a structural node in the composition structure. The Optimizely Graph schema for CompositionStructureNode is defined as:

PropertyTypeDescription
nodes[CompositionNode]The children nodes to the current node.

CompositionElementNode

A subtype to CompositionNode that contains a VisualBuilder element. The Optimizely Graph schema for CompositionElementNode is defined as:

PropertyTypeDescription
element_IElementThe element instance used. It can be cast to a specific element based on content type, like ImageElement, TextElement, and so on.

CompositionDisplaySetting

Represents a display setting value for a composition node. The Optimizely Graph schema for CompositionDisplaySetting is defined as:

PropertyTypeDescription
keyStringThe key for the display setting. Should match a key defined in the corresponding Display Template.
valueStringThe value for the display setting. Available values are defined in the corresponding Display Template.

Explicit Query

Content types based on Experience and Section have a property composition that contains the merged structure from the defined layout and data for the Visual Builder output. An experience composition contains a list of sections. A section is grid-based and consists of rows where each row has columns, and each column has elements. Given that structural knowledge, a query to get a composition can be specified as:

query ExplicitExperienceQuery {
  _Experience {
    items {
      composition {
        displayName
        displaySettings {
          key
          value
        }
        displayTemplateKey
        key
        nodeType
        nodes {
          displayName
          displaySettings {
            key
            value
          }
          displayTemplateKey
          key
          nodeType
          type
          ... on CompositionStructureNode {
            displayName
            displayTemplateKey
            key
            nodeType
            nodes {
              displayName
              displaySettings {
                key
                value
              }
              displayTemplateKey
              key
              nodeType
              type
              ... on CompositionStructureNode {
                displayName
                displaySettings {
                  key
                  value
                }
                displayTemplateKey
                key
                nodeType
                type
                nodes {
                  displayName
                  displaySettings {
                    key
                    value
                  }
                  displayTemplateKey
                  key
                  nodeType
                  type
                  ... on CompositionStructureNode {
                    displayName
                    displaySettings {
                      key
                      value
                    }
                    displayTemplateKey
                    key
                    nodeType
                    type
                    nodes {
                      displayName
                      displaySettings {
                        key
                        value
                      }
                      displayTemplateKey
                      key
                      nodeType
                      type
                      ... on CompositionElementNode {
                        displayName
                        displaySettings {
                          key
                          value
                        }
                        displayTemplateKey
                        key
                        nodeType
                        type
                        element {
                          ...compositionElement
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

fragment compositionElement on _IElement {
  ... on HeadingElement {
    Heading: Body
  }
  ... on RichTextElement {
    Body {
      json
    }
  }
  ... on ImageElement {
    AltText
    Image {
      url {
        default
      }
    }
  }
}

Recursive Query

The previous explicit query is repetitive in the manner that you query for a structure node in a fixed number of nested levels (given that you know that the structure of an experience is experience/section/row/column/element). And for each level you query for all available values (type, nodetype, displaySettings, and so on). An alternative way to the previous explicit query is to write a recursive query, see Reqursive queries in the Optimizely Graph documentation for information. The analogous recursive query to the explicit query above is:

query RecursiveExperienceQuery {  
  _Experience {  
    items {  
      composition {  
        ...structureElement  
      }  
    }  
  }  
}

fragment structureElement on ICompositionNode {  
  ... on CompositionStructureNode {  
    key  
    displayName  
    type  
    nodeType  
    displayTemplateKey  
    displaySettings {  
      key  
      value  
    }  
    nodes @recursive {  
      type  
    }  
  }  
  ... on CompositionElementNode {  
    key  
    displayName  
    type  
    nodeType  
    displayTemplateKey  
    displaySettings {  
      key  
      value  
    }  
    element {  
      ...compositionElement  
    }  
  }  
}

fragment compositionElement on _IElement {  
  ... on HeadingElement {  
    Heading: Body  
  }  
  ... on RichTextElement {  
    Body {  
      json  
    }  
  }  
  ... on ImageElement {  
    AltText  
    Image {  
      url {  
        default  
      }  
    }  
  }  
}