# Label Sets / Question Sets

## Span labeling

For span labeling, a label set is a single-column `.csv` file that follows the structure below.

| Column 1 |
| -------- |
| Label 1  |
| Label 2  |
| Label 3  |
| etc...   |

{% file src="/files/RujHf5DMkmhtr7gD4uSg" %}
NER label set
{% endfile %}

### Color-coded labels

We provide twelve default colors that you can configure during project creation or in the [Labels](/advanced/extensions/labels.md) extension.

![Label color palette](/files/J9SmyVL7TmDrSbiha79i)

You can also create a `.csv` label set file with your desired label colors using HTML color codes. In the sample below, `label,color` is the header, indicating two columns. This will always be the first row in the `.csv` file.

{% file src="/files/-MbjYI9KlLNdwRymQM3a" %}
Colored label set
{% endfile %}

```
label,color
Annabeth Chase,#df3920
Harry Potter,#ff8000
Hermione Granger,#4db34d
John Watson,#3399cc
Percy Jackson,#cc3399
Sherlock Holmes,#9933cc
```

{% hint style="info" %}
Colored label sets are only supported in the `.csv` format.
{% endhint %}

### Limit selection to bottom-level labels only

In hierarchical label sets, some labels act as broad categories while others are more specific. This setting restricts selection to bottom-level labels—those without child labels—to improve precision and consistency.

#### When to use

Use this setting when your project requires detailed and specific classification. Some examples:

* **Fruit**
  * Apple
  * Banana
* **Vegetable**
  * Carrot
  * Spinach

When enabled, labelers can select **Apple, Banana, Carrot, and Spinach**, but not **Fruit** or **Vegetable**.

#### How to configure

You can enable this setting during project creation, in an existing project, or in the Label Management page.

**During project creation**

1. Create new project.
2. Go to step 3 and select **Span labeling**.
3. In the **Label set** section, click the triple-dot menu on the label set and enable the setting.

![](/files/RTs53N2OhlhxXryBlYnm)

**Within a project**

1. Open the **Labels** extension and select a label set.
2. Click the triple-dot menu and choose one of the following:
   1. Add new label set
   2. Replace existing label set
   3. Edit label set
3. Expand the **Label set settings** accordion and enable the setting.

![](/files/ytMRquC1XTtWUoNKc0cI)

**Label management page**

1. Go to the **Label management** page.
2. Select **Add label set** or click **Edit** icon on an existing label set.
3. Expand the **Label set settings** accordion and enable the setting.

![](/files/ozq2GcBRQ2vPSAphrwaD)

#### Labeling behavior

When this setting is enabled:

* Only bottom-level labels can be selected.
* Parent labels with child labels are not selectable.
* Keyboard shortcuts (numbers, arrow keys, and `Enter`) apply only to bottom-level labels.

## Bounding box labeling

### **Label sets**

You can use `.csv`, `.tsv`, or `.json` formats for bounding box label sets.

* For `.csv` and `.tsv` files
  * We support **color names** (example: `red`), **hex values** (example: `#00FF00`), or **RGB** (example: `rgb(0,0,255)`).
  * You can also create a label set with only label names, as shown in the `Datasaur sample - Bbox only name.csv` file below.
  * Other properties, such as `captionAllowed` and `captionRequired`, will use default values if not specified.
* For `.json` files
  * We support **hex values** and **RGB** formats only.

{% file src="/files/iG5wYdtJYSKSIkIjYr1E" %}

{% file src="/files/88e4WXaWyWBV7b9u2NRd" %}

{% file src="/files/TXH3IJwCMJuq4vhBKCiH" %}

{% file src="/files/IDatnggwXcViBmOVnXxs" %}

{% file src="/files/idpJJxOEejnkoMFE4BO3" %}

### **Text caption**

The **Allow text caption** setting allows labelers to add a caption to a bounding box. If disabled, captions cannot be added.

<figure><img src="/files/97AuwOaiaqCF69mLzxH9" alt=""><figcaption></figcaption></figure>

You can require text for specific labels by enabling the **Require caption** option.

<figure><img src="/files/zd9BTvrwW3IyGQeECt5X" alt=""><figcaption></figcaption></figure>

## Row/Document labeling

For row labeling and document labeling projects, a question set is a `.csv` file with questions in the first column and answers in the subsequent columns.

| Column 1   | Column 2 | Column 3 | Column 4. |          |          |
| ---------- | -------- | -------- | --------- | -------- | -------- |
| Question 1 | Answer 1 | Answer 2 | Answer 3  |          |          |
| Question 2 | Answer 1 | Answer 2 |           |          |          |
| Question 3 | Answer 1 | Answer 2 | Answer 3  | Answer 4 | Answer 5 |

{% file src="/files/C8Z593J93QqKwdoezthI" %}
Question set that only contain dropdown question type
{% endfile %}

You can also use a `.json` file to create a question set with multiple question types.

{% file src="/files/i1PGcOaGbvbnkBPUo58w" %}
Complex question set
{% endfile %}

### Question hint

![](/files/LmckE0pJB1bzZY7PfHUx)

You can optionally add a hint to each question. Hints can include instructions or explanations to help labelers provide more accurate answers. Each hint can contain up to 65,000 characters.

You can configure question hints during project creation or in the [**Label management**](/workspace-management/label-management/question-set-management.md) page.

![Question hint in project creation](/files/8dvJRvryqMvzahkJ4ASd)

![Question hint in the label management page](/files/s0zIZkPB6VgvxCF1ySAB)

#### Supported format

The [Document labeling and Row labeling](/advanced/extensions/document-and-row-labeling.md) extensions support Markdown syntax in question hints. his allows you to format text, create lists, add links, or emphasize content using standard Markdown.

| Formatting                   | Syntax                               |
| ---------------------------- | ------------------------------------ |
| **Bold**                     | **your text**                        |
| *Italic*                     | *your text*                          |
| Underline                    | \<u>your text\</u>                   |
| • Bullet                     | dashes (-) or asterisks (\*)         |
| 1. Numbering                 | 1., 2., 3., etc.                     |
| [Link](https://example.com/) | \[your text] (<https://example.com>) |

{% hint style="info" %}
Markdown syntax counts toward the character limit (65,000 characters).
{% endhint %}

#### Best practices

Keep hints brief and focused on relevant information. Long hints may appear as large text blocks and clutter the UI. For more complex content, consider including links that labelers can open when needed.

![Hint with markdown syntax](/files/6hmfVUiPPtpX6pTOOoO4)

![Rendered markdown in the extension](/files/ZCQY4JDXRGnM84eHOxir)

### Question types

Here are the available question types for question sets.

#### **1.** Text field

**Text field** allows labelers to answer a question by entering a single line of free-form text.

<figure><img src="/files/QYqwjm8YRn4JL7MhmjGR" alt=""><figcaption></figcaption></figure>

You can add validation in the **More settings** accordion.

<figure><img src="/files/815xODllFZWiAdZCqoxC" alt=""><figcaption></figcaption></figure>

#### **2. Text area**

**Text area** allows labelers to answer a question by entering multi-line free-form text.

<figure><img src="/files/amC2ner4M9GrIQ68yKuB" alt=""><figcaption></figcaption></figure>

#### **3. Dropdown**

**Dropdown** requires labelers to answer a question by selecting one answer from a list.

<figure><img src="/files/M9Lh3ARTJGGy6sp0Lu1w" alt=""><figcaption></figcaption></figure>

You can upload a `.csv` file as an **answer set** for the dropdown options.

<figure><img src="/files/ATvBodctQveOtGn7tKYr" alt=""><figcaption></figcaption></figure>

{% file src="/files/-MbjYI9TJbaP-3rI3X5N" %}

You can also allow multiple selections by enabling **Allow multiple answers**.

<figure><img src="/files/hRpOg4v94diZ0eM5Luln" alt=""><figcaption></figcaption></figure>

#### **4. Hierarchical dropdown**

**Hierarchical dropdown** allows labelers to answer a question by selecting from structures, multi-level options.

<figure><img src="/files/cnpa3PgbJx9LiZx4JNVm" alt=""><figcaption></figcaption></figure>

You can upload a hierarchical answer set after creating the question with [this format](#hierarchical-label-sets-or-dropdown-options).

#### 5. True/False

{% hint style="info" %}
Previously called **Yes/No.**
{% endhint %}

**True/False** allows labelers to answer a question by checking the checkbox. You can also add a hint.

<figure><img src="/files/VJl4nH82N0ITLi7fFrcq" alt=""><figcaption></figcaption></figure>

#### 6. Single choice

{% hint style="info" %}
Previously called **Radio button**.
{% endhint %}

**Single choice** allows labelers to answer a question by selecting one answer from up to 25 options.

<figure><img src="/files/INsxHVxnss5RoyLdNLG2" alt=""><figcaption></figcaption></figure>

You can also add a hint.

<figure><img src="/files/yH3jANmT8fTZWPfWjRr5" alt=""><figcaption></figcaption></figure>

#### 7. Multiple choice

**Multiple choice** allows labelers to answer a question by selecting several answers from up to 25 options.

![](/files/joZvTcDy3thbr1EnW5L3)

#### **8. Date**

**Date** allows labelers to answer a question by selecting a date from a calendar, ensuring valid date input. Labelers can still type it manually if needed.

<figure><img src="/files/esSFuoQsOvQ6b8O4nw7y" alt=""><figcaption></figcaption></figure>

You can set the current date as the default value by enabling the **Use current date as default value** setting in step 3 of project creation.

<figure><img src="/files/lEhr7HmalMqcjQyaND7a" alt=""><figcaption></figcaption></figure>

#### **9. Time**

**Time** allows labelers to answer a question by selecting a time from a clock, ensuring valid time input. Labelers can still type it manually if needed.

<figure><img src="/files/kxrX12unHj76ziPAhPXV" alt=""><figcaption></figcaption></figure>

You can set the current time as the default value by enabling the **Use current time as default value** setting in step 3 of project creation.

<figure><img src="/files/Q2uiEuSlkOmK9Rn7V47X" alt=""><figcaption></figcaption></figure>

#### **10. Slider**

**Slider** allows labelers to answer a question by selecting a numeric value within a defined range (example: from 1 to 10).

<figure><img src="/files/zk6UwQyRfGXADWymYXy1" alt=""><figcaption></figcaption></figure>

You can hide the value from labelers if needed (it remains visible in reviewer mode).

<figure><img src="/files/lg5jtzVWKOlyNCicTpnw" alt=""><figcaption></figcaption></figure>

You can customize the slider color using predefined options or custom values ([hex, color name, or RGB](https://developer.mozilla.org/en-US/docs/Web/CSS/named-color)).

<figure><img src="/files/m4pRwVfYiijSzzBisaOD" alt=""><figcaption></figcaption></figure>

You can also use the interactive preview to test the slider.

<figure><img src="/files/eFkSnOp2yLnF2IPCr3S1" alt=""><figcaption></figcaption></figure>

When you change the **minimum** or **maximum** value of a slider question, existing answers outside the new range will trigger an error message in the **Row labeling** or **Document labeling** extension when users select the affected row or document.

{% file src="/files/AQd4DVNYsYUFS5YKi3wT" %}

#### **11. URL**

**URL** allows labelers to input links with validation.

<figure><img src="/files/GEJB57aq3sAg24E3Z5iV" alt=""><figcaption></figcaption></figure>

#### 12. Grouped attributes

**Grouped attributes** allows multiple related questions to be grouped together.

<figure><img src="/files/BiO0kdy0gUXniYy2Je00" alt=""><figcaption></figcaption></figure>

#### **13. Script-generated questions**

{% hint style="info" %}
Available only for **Row labeling** projects.
{% endhint %}

**Script-generated questions** dynamically generates questions for each row based on its data, allowing more flexible and dynamic workflows. For more details, see this page [here](/advanced/script-generated-question.md).

<figure><img src="/files/lA8oWdrS3dN90nvgIKo0" alt=""><figcaption></figcaption></figure>

### **Advanced settings**

In row labeling projects, you can use the **Refer answer to table column** option in **Advanced settings** to pre-fill answers based on your dataset. See the [full guide](/data-studio-projects/lets-get-labeling/label-sets/refer-answer-to-table-column.md) for more details.

### **Answer validation script**

{% hint style="info" %}
This feature is available only in **row labeling** projects and is disabled by default. Please reach out to [**support@datasaur.ai**](mailto:support@datasaur.ai) if your team needs this feature.
{% endhint %}

The a**nswer validation script** is a TypeScript-based feature that validates answers in row labeling tasks. It allows you to define custom validation logic for complex scenarios, such as validating answers using other questions, comparing data across questions, or calling external APIs. If a submission fails validation, an error message is shown.

This feature improves control, accuracy, and consistency in the labeling process.

![](/files/pw2ACAdFP46OkyWp0FoM)

#### **Key capabilities**

1. **Row-specific validation**: Validates data based on the current row.
2. **Cross-question validation**: Compares answers across multiple questions.
3. **API-based validation**: Use external APIs or external business logic for validation.

#### Configure the validation script

{% hint style="info" %}
Validation can only be configured after questions are set up. Only admins can access this feature in reviewer mode.
{% endhint %}

1. Go to the **Row labeling** extension in a project.
2. Click on the three-dot menu.
3. Select **Configure answer validation script**.

   ![](/files/3i3q7zrXa0lS6z2zPgCF)

   ![](/files/FUWifYLdJa0nQYdueAeW)

When you open the **Configure answer validation script** dialog for the first time, a template is provided.

<details>

<summary>View Template</summary>

```tsx
/**
 * This function should return a ValidationResult object.
 *
 * @param {ValidationArgs} args - The arguments for the validation.
 * @returns {ValidationResult} The result of the validation.
 * @example
 * To return an error:
 *   return { errorMessage: "This is a sample error message." };
 * To return no error:
 * return {}
 */
async ({ columns, row, questions, answers }: ValidationArgs): Promise<ValidationResult> => {
  **// TODO: Implement your validation logic here.**

  return {};

  /** Helper functions with access to the validation args */

  /**
   * Get the answer for a question by its label.
   * For grouped attributes, pass in the questions array from the grouped attribute.
   * @param label - The label of the question.
   * @param searchQuestions - Optional. The questions to search through. Defaults to the questions in the validation args.
   * @returns The answer for the question.
   */
  function getAnswerByQuestionLabel(label: string, searchQuestions: Question[] = questions) {
    const question = searchQuestions.find((q) => q.label === label);
    if (!question) throw new Error(`Could not find question with label: "${label}".`);
    return answers[`Q${question.id}`];
  }

  /**
   * Get the value of a cell by its column label.
   * @param label - The label of the column.
   * @returns The value of the cell.
   */
  function getCellValueByColumnLabel(label: string) {
    const column = columns.find((column) => column.name === label);
    if (!column) {
      throw new Error(`Couldn't find column with label: "${label}".`);
    }

    const cell = row.find((row) => row.index === column.id);
    if (!cell) {
      throw new Error(`Couldn't find cell with index: ${column.id}. Column: "${column.name}"`);
    }

    return cell.content;
  }
};
```

</details>

To provide feedback when a submission fails, return an object with an `errorMessage` property (optional). When the submission passes, return an empty object.

{% tabs %}
{% tab title="🔴 Failing the submission" %}

```tsx
async ({ columns, row, questions, answers }: ValidationArgs): Promise<ValidationResult> => {
  // this script will always prevent the labeler to submit the answer.
  return { errorMessage: 'Please double-check your answers.' };
}
```

{% endtab %}

{% tab title="🟢 Passing the submission" %}

```tsx
async ({ columns, row, questions, answers }: ValidationArgs): Promise<ValidationResult> => {
  // this script will always allow the labelers to submit the answer.
  return {};
}
```

{% endtab %}
{% endtabs %}

When validating, you may need to access certain information to determine whether the answer is valid or needs adjustment before submission. You can access all required data from the function argument, as shown in the example function.

* <mark style="color:red;">`columns: TableColumn[]`</mark> contains information about the column structure of the data being labeled.

<details>

<summary>View structure</summary>

```tsx
interface TableColumn {
  id: number;
  name: string;
  displayed: boolean;
  labelerRestricted: boolean;
  rowQuestionId?: number;
}
```

</details>

* <mark style="color:red;">`row: Cell[]`</mark> is an array of cells containing the data that is being labeled.

<details>

<summary>View structure</summary>

<pre class="language-tsx"><code class="lang-tsx"><strong>interface Cell {
</strong>  line: number;
  index: number;
  content: string;
  tokens: string[];
  metadata?: CellMetadata[];
}

interface CellMetadata {
  key: string;
  value: string;
  type?: string;
  pinned?: boolean;
  config?: TextMetadataConfig;
}

interface TextMetadataConfig {
  backgroundColor: string;
  color: string;
  borderColor: string;
}
</code></pre>

</details>

* <mark style="color:red;">`questions: Question[]`</mark> is an array of questions in the project.

<details>

<summary>View structure</summary>

```tsx
enum QuestionType {
  DROPDOWN = 'DROPDOWN',
  HIERARCHICAL_DROPDOWN = 'HIERARCHICAL_DROPDOWN',
  NESTED = 'NESTED',
  TEXT = 'TEXT',
  SLIDER = 'SLIDER',
  DATA = 'DATA',
  DATE = 'DATE',
  TIME = 'TIME',
  CHECKBOX = 'CHECKBOX',
  URL = 'URL',
}

enum SliderTheme {
  PLAIN = 'PLAIN',
  GRADIENT = 'GRADIENT',
}

interface Question {
  id: number;
  label: string;
  type: QuestionType;
  required: boolean;

  activationConditionLogic?: string;
  bindToColumn?: string;

  config: QuestionConfig;
}

interface QuestionConfig {
  multiple?: boolean;

  // TEXT
  maxLength?: number;
  minLength?: number;
  pattern?: string;
  multiline?: boolean;

  // SLIDER
  theme?: SliderTheme;
  min?: number;
  max?: number;
  step?: number;

  // DATE TIME
  format: string;
  defaultValue?: string;

  // DROPDOWN HIERARCHICAL
  options?: Array<{ id: string; label: string; parentId?: string | null }>;

  // GROUPED
  questions?: Array<Question>;

  // CHECKBOX
  hint?: string;
}
```

</details>

* <mark style="color:red;">`answers`</mark> is an object where each key is a question ID and each value is its corresponding answer. Depending on the question type, the value can take one of these four formats:

  |                    | multiple: false | multiple: true |
  | ------------------ | --------------- | -------------- |
  | normal question    | string          | string\[]      |
  | grouped attributes | Answer          | Answer\[]      |

<details>

<summary>View structure</summary>

<pre><code><strong>type Answer = string | string[] | Answers[];
</strong>
interface Answers {
  [questionId: string]: Answer;
}
</code></pre>

</details>

We provide helper functions in the template to simplify common data access tasks, such as:

* <mark style="color:red;">`function getCellValueByColumnLabel(label: string): string;`</mark>

  This function returns the value of a cell based on the column label.
* <mark style="color:red;">`function getAnswerByQuestionLabel(label: string, searchQuestions: Question[] = questions): Answers;`</mark>

  This function returns the answer based on the question label.

#### Validating answer through an API call

You can include API requests in your validation logic using the [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API), enabling dynamic or third-party validations.

{% hint style="warning" %}
**Disclaimer**

* We are not responsible for API calls that are misrouted, misconfigured, or sent to unintended parties, which may result in data exposure or compromise.
* You are responsible for ensuring the accuracy, security, and integrity of your API configurations and transmissions. By using this feature, you acknowledge and accept these responsibilities.
  {% endhint %}

#### Examples

<details>

<summary>Validating answers between two questions</summary>

```tsx
async ({ questions, answers }: ValidationArgs): Promise<ValidationResult> => {
  const questionAAnswer = getAnswerByQuestionLabel("Question A");
  const questionBAnswer = getAnswerByQuestionLabel("Question B");

  if (questionAAnswer !== questionBAnswer) {
    return { errorMessage: "The answer to Question A must match Question B." };
  }

  return {}; // Pass the validation
  
  // ...existing helpers provided by template
};
```

</details>

<details>

<summary>Validating an answer based on a cell value</summary>

```tsx
async ({ columns, row, questions, answers }: ValidationArgs): Promise<ValidationResult> => {
  const statusColumnValue = getCellValueByColumnLabel("Status");
  const approvalStatusAnswer = getAnswerByQuestionLabel("Approval Status");

  if (statusColumnValue === "Complete" && approvalStatusAnswer !== "Approved") {
    return { errorMessage: "If 'Status' is 'Complete', 'Approval Status' must be 'Approved'." };
  }

  return {};
  
  // ...existing helpers provided by template
};
```

</details>

<details>

<summary>Validating an answer through an API request using the Fetch API</summary>

```tsx
async ({ columns, row, questions, answers }: ValidationArgs): Promise<ValidationResult> => {
	const response = await fetch('<https://some.api.net/validate>', ...);
	const data = await response.json(); // assume the API returns a JSON object: { result: 'valid|invalid', message: 'the error message' };
	
	if (data.result === 'invalid') {
	  return { errorMessage: data.message };
	}

  return {};
  
  // ...existing helpers provided by template
}
```

</details>

#### **FAQs**

1. **Can I validate across multiple rows?**

   No, the validation script is row-specific and operates on each row individually.
2. **What happens if there is an error in the script?**

   Unhandled errors or exceptions will trigger a validation error and prevent submission. You can handle errors within the script to allow submission if needed.

## **Hierarchical label sets or dropdown options**

You can upload multi-level hierarchical label sets for span labeling projects, and hierarchical dropdown options for row labeling or document labeling projects.

The following example shows a supported `.csv` format:

{% file src="/files/CGftTJyXD6E7jfKt1aZL" %}

```
id,label
1,Novel
1.1,Author
1.1.1,Name
1.1.2,Works
1.2,Title
1.2.1,Main Title
1.2.2,Subtitle
2,Characters
2.1,Antagonist
2.2,Protagonist
```

### **File structure**

#### **1. Header**

The header <mark style="color:red;">**`id,label`**</mark> will always be the first row in the `.csv` file. The first label or option should have `1` as the ID, just like in the example above.

#### **2. ID format**

IDs follow a hierarchical numbering format similar to Microsoft Word:

* `Novel` is the root level with ID `1`**.**
* `Author` is a second-level category under `Novel` with ID `1.1`.
* `Name` is a third-level item under `Author` with ID `1.1.1`

{% hint style="info" %}
**Important notes**

When importing data, the CSV format uses dots (`.`) to represent hierarchical relationships. However, these dots are automatically converted into a different ID structure in the JSON format because dots are reserved for path traversal operations in the system. **This means dots must not be used in JSON IDs**. Here's how it works:

* CSV Input:

  ```typescript
  id,label
  1,Novel
  1.1,Author
  ```
* Will be converted to JSON as:

  ```json
  [  
    {    
      "label": "Novel",    
      "id": "1"  
    },  
    {    
      "label": "Author",    
      "id": "2",    
      "parentId": "1"  
    }
  ]
  ```

  In JSON format:

  * ✅ Correct: <mark style="color:red;">`"id": "2"`</mark>
  * ❌ Incorrect: <mark style="color:red;">`"id": "1.1"`</mark>

  Using dots for JSON IDs will cause incorrect path resolution when selecting items in the hierarchy.
  {% endhint %}

#### 3. Hierarchical label set in span labeling projects

The hierarchy will be visible in the **Labels** extension and the label box. You can also use the same label name under different parent labels.

```
id,label
1,Software
1.1,Java
2,Geography
2.1,Java
```

In the example above, although `Java` appears twice, each instance belongs to a different parent, making it contextually unique.

<figure><img src="/files/89JC0ur6gdeB0UjptZ9J" alt=""><figcaption></figcaption></figure>

Using the same label name more than once under the same parent is not allowed. In the example below, the system flags an error because both `Apple` entries are under `Fruit`.

```
id,label
1,Fruit
1.1,Apple
1.2,Apple
```

#### 4. Hierarchical dropdown options in row or document labeling projects

Choose **Hierarchical dropdown** as the question type when creating the project. The hierarchy will be displayed in the **Row labeling** and **Document labeling** extension and the answer column in the table.

![](/files/JLOPxARxmKI0rdTuhaPH)

{% hint style="info" %}
In the dropdown menu:

* Clicking the **Home** icon navigates to the top-level label.
* You can search for **bottom-level options** globally.
  {% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.datasaur.ai/data-studio-projects/lets-get-labeling/label-sets.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
