Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding in natural language queries extension #468

Merged
merged 59 commits into from
Jun 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
3404a66
starting working on queryTranslator
alfredorubin96 Jun 1, 2023
6b19f3e
added comments and starting work on openAiClient definiton
alfredorubin96 Jun 1, 2023
5504b63
Merge branch 'develop' into feature/query-translator-dev
BennuFire Jun 5, 2023
5fa1d0c
defined thunk to connect each report with the model
alfredorubin96 Jun 5, 2023
b1b103e
working on abstract class
alfredorubin96 Jun 6, 2023
ccfcd65
fixing state inconsistency when reloading and commenting
alfredorubin96 Jun 6, 2023
cc7757a
more comments and added card query thunk inside translation
alfredorubin96 Jun 6, 2023
56f6cf8
Merge branch 'develop' into feature/query-translator-dev
BennuFire Jun 7, 2023
e828425
Updating interface
nielsdejong Jun 8, 2023
f954ae3
Styling of extensions
nielsdejong Jun 8, 2023
846735e
Style tweak
nielsdejong Jun 8, 2023
4466970
Merge branch 'develop' into feature/query-translator-dev
BennuFire Jun 8, 2023
efbe1bb
Added dual-language support for card settings content
nielsdejong Jun 8, 2023
523e7a5
Merge branch 'feature/query-translator-dev' of github.com:neo4j-labs/…
nielsdejong Jun 8, 2023
c9ed53d
refactoring some variable names, added reducer for lastMessage
alfredorubin96 Jun 8, 2023
bffd9bd
refactoring some variable names, added reducer for lastMessage
alfredorubin96 Jun 8, 2023
8f2279b
plugged sessionStorage, it will be flushed after a new connection
alfredorubin96 Jun 9, 2023
95d79d6
refactoring folder name, added comments
alfredorubin96 Jun 11, 2023
838ac69
refactoring folder name, added comments
alfredorubin96 Jun 11, 2023
690337f
moved docs inside the developer guide
alfredorubin96 Jun 11, 2023
f4e8de5
added reportexamples in the user message
Jun 12, 2023
9dbba0e
Merge branch 'feature/query-translator-dev' of https://github.com/neo…
Jun 12, 2023
79cc1b7
Break out query component
nielsdejong Jun 12, 2023
40a1fb8
added migration for new extension architecture from 2.2 to 2.3 and ad…
alfredorubin96 Jun 12, 2023
de37031
Merge branch 'feature/query-translator-dev' of https://github.com/neo…
alfredorubin96 Jun 12, 2023
80c9329
Revert
nielsdejong Jun 12, 2023
b7842d4
Merge branch 'feature/query-translator-dev' of https://github.com/neo…
alfredorubin96 Jun 12, 2023
7e2f69d
Generalizing
nielsdejong Jun 12, 2023
fce269a
Merge branch 'feature/query-translator-dev' of github.com:neo4j-labs/…
nielsdejong Jun 12, 2023
27d5acd
Props drilling
nielsdejong Jun 12, 2023
ed07686
Plugged translation on switch
nielsdejong Jun 12, 2023
96f7982
UX improvements
nielsdejong Jun 12, 2023
8855a78
Better UX
nielsdejong Jun 12, 2023
9ccb5e1
added correct error throwing in modelClient
alfredorubin96 Jun 12, 2023
cea77bf
UX fix
nielsdejong Jun 12, 2023
e1fd820
Merge branch 'feature/query-translator-dev' of github.com:neo4j-labs/…
nielsdejong Jun 12, 2023
621d461
Minor UX improvement for settings of extension
nielsdejong Jun 13, 2023
dc5fd3b
Added docs template
nielsdejong Jun 13, 2023
0c32b8e
added function in queryTranslation to get back the current validation…
alfredorubin96 Jun 13, 2023
b1afe63
Added skeleton for injecting a pre-report-populating translation func…
nielsdejong Jun 13, 2023
9a9ab5c
Add skeleton for pre-report population logic
nielsdejong Jun 14, 2023
b76b06f
Bumped OpenAI lib version
nielsdejong Jun 14, 2023
be721bb
Fixes
nielsdejong Jun 14, 2023
0ee9077
Fixed glitchy caching in english editor
nielsdejong Jun 14, 2023
ab839cf
Fix bugs
nielsdejong Jun 14, 2023
4083b63
moved model client inside SessionStorage, fixed error in query-transl…
alfredorubin96 Jun 14, 2023
8787251
added doc about natural language queries
Jun 14, 2023
61ff0d2
Added custom running icon
nielsdejong Jun 14, 2023
4f1ecba
Merge branch 'feature/query-translator-dev' of github.com:neo4j-labs/…
nielsdejong Jun 14, 2023
4c57eaf
Pushing new logic for session storage
nielsdejong Jun 14, 2023
0eeecba
Pushing non-broken test code
nielsdejong Jun 14, 2023
eb2f654
updated the doc
Jun 14, 2023
ff6644f
added logic to report to work with prepopulation functions
alfredorubin96 Jun 14, 2023
92a894b
plugged everything
nielsdejong Jun 14, 2023
0ded17b
Minor style tweaks
nielsdejong Jun 14, 2023
f60a2ca
Added pics and also how it works section
Jun 16, 2023
a461b51
Status handling for GPT config screen
nielsdejong Jun 16, 2023
768ea35
removed useless readme file in query-translator. Changed function cal…
alfredorubin96 Jun 19, 2023
9105ebf
changing some bits of code based on github conversations and removed …
alfredorubin96 Jun 19, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added docs/modules/ROOT/images/englisheditor.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/modules/ROOT/images/extensionbutton.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/modules/ROOT/images/llmconfiguration.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions docs/modules/ROOT/nav.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
*** xref:user-guide/extensions/advanced-visualizations.adoc[Advanced Visualizations]
*** xref:user-guide/extensions/rule-based-styling.adoc[Rule-Based Styling]
*** xref:user-guide/extensions/report-actions.adoc[Report Actions]
*** xref:user-guide/extensions/natural-language-queries.adoc[Natural Language Queries]
** xref:user-guide/faq.adoc[FAQ]
* xref:developer-guide/index.adoc[Developer Guide]
** xref:developer-guide/build-and-run.adoc[Build & Run]
Expand All @@ -39,6 +40,7 @@
** xref:developer-guide/design.adoc[Design]
** xref:developer-guide/adding-visualizations.adoc[Adding Visualizations]
** xref:developer-guide/state-management.adoc[State Management]
** xref:developer-guide/session-storage.adoc[Session Storage]
** xref:developer-guide/testing.adoc[Testing]
** xref:developer-guide/contributing.adoc[Contributing]

5 changes: 5 additions & 0 deletions docs/modules/ROOT/pages/developer-guide/session-storage.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
= Session Storage

This reducer serves only to store data that we want to reset at each new session.
To connect to it, just define a key and use the predefined actions to set a new pair (key,value) inside of it.
Inside the actions there is also an action to delete all the keys that match a precise prefix, it can be useful, for example, to wipe the sessionStorage state for a certain extension, if it stores the data inside the sessionStorage using a prefix (for example look at the query-translator extension at getSessionStorageHistoryKey).
3 changes: 2 additions & 1 deletion docs/modules/ROOT/pages/user-guide/extensions/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ The currently available extensions in NeoDash are:

- link:advanced-visualizations[Advanced Visualizations]
- link:rule-based-styling[Rule-based Styling]
- link:report-actions[Report Actions (Pro)]
- link:report-actions[Report Actions]
- link:natural-language-queries[Natural Language Queries]

== Types of Extensions

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
= Natural Language Query Generation in NeoDash!
Use natural language to generate Cypher queries in NeoDash. Connect to an LLM through an API, and let NeoDash use your database schema + the report types to generate queries automatically.

== Natural Language Queries
Natural Language Queries feature allows users to interact with NeoDash using natural language to generate Cypher queries for querying Neo4j graph databases.
This integration leverages Language Models (LLMs) to interpret user inputs and generate Cypher queries based on the provided schema definition.

== Configuration
To enable Natural Language Queries in NeoDash, follow these configuration steps:

1. Open NeoDash and navigate to the "Extensions" section in the left sidebar.
2. Locate the "Natural Language Queries" extension and click on it to activate it.
3. Once activated, a new button will appear in the sidebar(see image below). Click on the button to open the configuration window.
4. In the configuration window, you will be prompted to provide the necessary information to connect to the Language Model (LLM). Enter the model provider, API key, and select the desired model to use.
5. After providing the required information, click on the "Start Querying" button to finalize the configuration.

image::extensionbutton.png[Extension Button enables Natural Language Queries button in the sidebar]

image::llmconfiguration.png[Configuration settings for the Natural Language Queries extension]

== Usage
Once the Natural Language Queries extension is configured, you can start using it in your NeoDash reports. Here's how:

1. Open the Report settings for the desired report.
2. In the report settings, you will find a toggle switch located above the editor. This switch allows you to toggle between Cypher and English languages.
3. Since you have enabled the extension and authenticated by providing your API key, you can switch to the English language mode.
4. Start formulating your queries in plain English, using natural language expressions to describe the data you want to retrieve.
5. After composing your query, you have two options for further actions:

* Translate: By clicking the "Translate" button, your query will be translated into Cypher using the Language Model. The translated Cypher query will be displayed in the editor when you toggle to the Cypher view.
This allows you to review and modify the generated Cypher query before execution.
* Run: If you wish to directly execute the query and view the results, click the "Run" button in the top right corner. The execution of the query will depend on the selected report type, and the results will be displayed accordingly.

image::englisheditor.png[Example of the English editor in NeoDash]

=== Here is how it works behind the scenes:
* Retrieve the Schema: The system prompts at the beginning of the interaction to retrieve the database schema. This ensures that the generated queries adhere to the provided schema and available relationship types and properties.

* Prompting in English: Once the schema is retrieved, you can start prompting your queries in plain English. NeoDash, powered by the LLM, will interpret your English query and generate the corresponding Cypher query based on the provided schema.

* Automatic Query Generation: NeoDash automatically generates the Cypher queries for you, taking into account the report type you specified. Whether it's a table, graph, bar chart, line chart, or any other supported report type, the generated queries will retrieve the necessary data based on the report requirements.

* Retry Logic: To enhance the reliability of the generated queries, we have implemented retry logic. If there is any issue or error during the query generation process, the system will attempt to retry three times as a maximum and provide a valid query to ensure smooth query execution.

== Prompting Tips

When using Natural Language Queries in NeoDash, keep the following tips in mind to enhance your experience:

1. Be clear and specific in your queries: Provide detailed descriptions of the data you want to retrieve, including node labels, relationship types, and property values.
2. Use keywords and phrases: Incorporate relevant keywords and phrases that are commonly used in the context of your data to improve query accuracy.
3. Ask precise questions: Frame your queries as questions to obtain specific information. For example, instead of "Show me all customers," try "Which customers have made a purchase in the last month?"
4. Experiment with different phrasings: If you're not getting the desired results, try rephrasing your query using synonyms or alternative expressions.
5. Avoid ambiguous queries: Ambiguous or vague queries may yield unexpected results. Make sure to provide sufficient context and clarify any ambiguities.
6. Validate and review generated queries: Always review the generated Cypher queries to ensure they accurately represent your intent and produce the expected results.


== Important Considerations

When using Natural Language Queries with Language Models, it's important to be aware of the following considerations:

1. Multiple model providers: Depending on your configuration, your queries may be processed by different model providers. Take into account that this means your data is being sent to different providers.
2. Non-deterministic nature: Language Models can produce non-deterministic outputs. The generated queries may vary between different runs, even with the same input prompt. Validate the generated queries and perform thorough testing to ensure correctness.
3. Potential hallucination: Language Models can generate outputs that may not align with the specific schema or data constraints. Exercise caution and verify the results to prevent potential inaccuracies or hallucinations.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
"mui-color": "^2.0.0-beta.2",
"mui-nested-menu": "^3.2.1",
"neo4j-client-sso": "^1.2.2",
"openai": "^3.3.0",
"postcss": "^8.4.21",
"postcss-loader": "^7.2.4",
"postcss-preset-env": "^8.3.0",
Expand Down
17 changes: 17 additions & 0 deletions public/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -198,3 +198,20 @@
.cm-tooltip-autocomplete {
margin-top: 4px;
}

@keyframes pulse {
0% {
transform: scale(0.95);
box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.7);
}

70% {
transform: scale(1);
box-shadow: 0 0 0 10px rgba(0, 0, 0, 0);
}

100% {
transform: scale(0.95);
box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
}
}
Binary file added public/translator.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions src/application/Application.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ import NeoReportHelpModal from '../modal/ReportHelpModal';
import '@neo4j-ndl/base/lib/neo4j-ds-styles.css';
import { ThemeProvider } from '@mui/material/styles';
import lightTheme from '../component/theme/Themes';
import { resetSessionStorage } from '../sessionStorage/SessionStorageActions';

/**
* This is the main application component for NeoDash.
Expand Down Expand Up @@ -175,6 +176,7 @@ const mapStateToProps = (state) => ({
const mapDispatchToProps = (dispatch) => ({
createConnection: (protocol, url, port, database, username, password) => {
dispatch(setConnected(false));
dispatch(resetSessionStorage());
dispatch(createConnectionThunk(protocol, url, port, database, username, password));
},
createConnectionFromDesktopIntegration: () => {
Expand Down
3 changes: 3 additions & 0 deletions src/card/Card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ const NeoCard = ({
<Collapse disablestrictmodecompat='true' in={!settingsOpen} timeout={collapseTimeout} style={{ height: '100%' }}>
<Card ref={ref} style={{ height: '100%' }}>
<NeoCardView
id={id}
settingsOpen={settingsOpen}
editable={editable}
dashboardSettings={dashboardSettings}
Expand Down Expand Up @@ -165,6 +166,8 @@ const NeoCard = ({
<Collapse disablestrictmodecompat='true' in={settingsOpen} timeout={collapseTimeout}>
<Card style={{ height: '100%' }}>
<NeoCardSettings
pagenumber={dashboardSettings.pagenumber}
reportId={id}
settingsOpen={settingsOpen}
query={report.query}
database={database}
Expand Down
4 changes: 4 additions & 0 deletions src/card/settings/CardSettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import { CARD_HEADER_HEIGHT } from '../../config/CardConfig';

const NeoCardSettings = ({
settingsOpen,
pagenumber,
reportId,
query,
database, // Current database related to the report
databaseList, // List of databases the user can choose from ('system' is filtered out)
Expand Down Expand Up @@ -53,6 +55,8 @@ const NeoCardSettings = ({
// TODO - instead of hiding everything based on settingsopen, only hide the components that slow down render (cypher editor)
const cardSettingsContent = settingsOpen ? (
<NeoCardSettingsContent
pagenumber={pagenumber}
reportId={reportId}
query={query}
database={database}
reportSettings={reportSettings}
Expand Down
87 changes: 61 additions & 26 deletions src/card/settings/CardSettingsContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,19 @@ import React, { useEffect } from 'react';
import CardContent from '@mui/material/CardContent';
import debounce from 'lodash/debounce';
import { useCallback } from 'react';
import NeoCodeEditorComponent from '../../component/editor/CodeEditorComponent';
import NeoCodeEditorComponent, {
DEFAULT_CARD_SETTINGS_HELPER_TEXT_STYLE,
} from '../../component/editor/CodeEditorComponent';
import { getReportTypes } from '../../extensions/ExtensionUtils';
import { Dropdown } from '@neo4j-ndl/react';
import {
EXTENSIONS_CARD_SETTINGS_COMPONENT,
getExtensionCardSettingsComponents,
} from '../../extensions/ExtensionConfig';

const NeoCardSettingsContent = ({
pagenumber,
reportId,
query,
database, // Current report database
databaseList, // List of databases the user can choose from ('system' is filtered out)
Expand Down Expand Up @@ -36,6 +44,57 @@ const NeoCardSettingsContent = ({
const reportTypes = getReportTypes(extensions);
const SettingsComponent = reportTypes[type] && reportTypes[type].settingsComponent;

function hasExtensionComponents() {
return (
Object.keys(EXTENSIONS_CARD_SETTINGS_COMPONENT).filter(
(name) => extensions[name] && EXTENSIONS_CARD_SETTINGS_COMPONENT[name]
).length > 0
);
}

function updateCypherQuery(value) {
debouncedQueryUpdate(value);
setQueryText(value);
}

function renderExtensionsComponents() {
const res = (
<>
{Object.keys(EXTENSIONS_CARD_SETTINGS_COMPONENT).map((name) => {
const Component = extensions[name] ? EXTENSIONS_CARD_SETTINGS_COMPONENT[name] : '';
return Component ? (
<Component
pagenumber={pagenumber}
reportId={reportId}
reportType={type}
extensions={extensions}
cypherQuery={queryText}
updateCypherQuery={updateCypherQuery}
/>
) : (
<></>
);
})}
</>
);
return res;
}

const defaultQueryBoxComponent = (
<>
<NeoCodeEditorComponent
value={queryText}
editable={true}
language={reportTypes[type] && reportTypes[type].inputMode ? reportTypes[type].inputMode : 'cypher'}
onChange={(value) => {
updateCypherQuery(value);
}}
placeholder={`Enter Cypher here...`}
/>
<div style={DEFAULT_CARD_SETTINGS_HELPER_TEXT_STYLE}>{reportTypes[type] && reportTypes[type].helperText}</div>
</>
);

return (
<CardContent style={{ paddingTop: '10px', paddingBottom: '10px' }}>
<Dropdown
Expand Down Expand Up @@ -94,31 +153,7 @@ const NeoCardSettingsContent = ({
onQueryUpdate={onQueryUpdate}
/>
) : (
<div>
<NeoCodeEditorComponent
value={queryText}
editable={true}
language={reportTypes[type] && reportTypes[type].inputMode ? reportTypes[type].inputMode : 'cypher'}
onChange={(value) => {
debouncedQueryUpdate(value);
setQueryText(value);
}}
placeholder={'Enter Cypher here...'}
/>
<div
style={{
color: 'grey',
fontSize: 12,
paddingLeft: '5px',
borderBottom: '1px solid lightgrey',
borderLeft: '1px solid lightgrey',
borderRight: '1px solid lightgrey',
marginTop: '0px',
}}
>
{reportTypes[type] && reportTypes[type].helperText}
</div>
</div>
<div>{hasExtensionComponents() ? renderExtensionsComponents() : defaultQueryBoxComponent}</div>
)}
</CardContent>
);
Expand Down
2 changes: 1 addition & 1 deletion src/card/settings/CardSettingsHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ const NeoCardSettingsHeader = ({
action={
<>
{fullscreenEnabled ? expanded ? unMaximizeButton : maximizeButton : <></>}
<Tooltip title='Save' aria-label='save'>
<Tooltip title='Run' aria-label='run'>
<IconButton
aria-label='save'
onClick={(e) => {
Expand Down
4 changes: 3 additions & 1 deletion src/card/view/CardView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { IconButton } from '@neo4j-ndl/react';
import { PlayCircleIconSolid } from '@neo4j-ndl/react/icons';

const NeoCardView = ({
id,
title,
database,
query,
Expand Down Expand Up @@ -137,7 +138,7 @@ const NeoCardView = ({
}, [JSON.stringify(localParameters)]);

useEffect(() => {
if (!settingsOpen && selectorChange) {
if (!settingsOpen) {
setLastRunTimestamp(Date.now());
}
setSelectorChange(false);
Expand Down Expand Up @@ -168,6 +169,7 @@ const NeoCardView = ({
<CardContent ref={ref} style={cardContentStyle}>
{active ? (
<NeoReportWrapper
id={id}
query={query}
database={database}
parameters={localParameters}
Expand Down
10 changes: 10 additions & 0 deletions src/component/editor/CodeEditorComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@ import { CypherEditor, CypherEditorProps } from '@neo4j-cypher/react-codemirror'
import { markdown, markdownLanguage } from '@codemirror/lang-markdown';
// import { languages } from '@codemirror/language-data';

export const DEFAULT_CARD_SETTINGS_HELPER_TEXT_STYLE = {
color: 'grey',
fontSize: 12,
paddingLeft: '5px',
borderBottom: '1px solid lightgrey',
borderLeft: '1px solid lightgrey',
borderRight: '1px solid lightgrey',
marginTop: '0px',
};

const markdownExtensions = [
markdown({
base: markdownLanguage, // Support GFM
Expand Down
2 changes: 1 addition & 1 deletion src/component/field/Field.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ const NeoField = ({
onChange: (newValue) => onChange(newValue.value),
value: value != null ? { label: value, value: value } : { label: defaultValue, value: defaultValue },
menuPlacement: 'auto',
isDisabled: disabled,
}}
disabled={disabled}
helpText={helperText}
placeholder={placeholder}
size={size}
Expand Down
2 changes: 2 additions & 0 deletions src/dashboard/DashboardThunks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,8 @@ export function upgradeDashboardVersion(dashboard: any, origin: string, target:
styling: {
active: true,
},
active: true,
alfredorubin96 marked this conversation as resolved.
Show resolved Hide resolved
activeReducers: [],
};
dashboard.version = '2.3';

Expand Down
6 changes: 4 additions & 2 deletions src/dashboard/drawer/DashboardDrawer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export const NeoDrawer = ({
* are enabled and present a button (EX: node-sidebar)
* @returns JSX element containing all the buttons related to their enabled extensions
*/
function renderDrawerExtensionsButton() {
function renderDrawerExtensionsButtons() {
const res = (
<>
{Object.keys(EXTENSIONS_DRAWER_BUTTONS).map((name) => {
Expand Down Expand Up @@ -85,20 +85,22 @@ export const NeoDrawer = ({
dashboardSettings={dashboardSettings}
updateDashboardSetting={updateDashboardSetting}
navItemClass={navItemClass}
extensions={extensions}
></NeoSettingsModal>

<NeoSaveModal navItemClass={navItemClass}></NeoSaveModal>
<NeoLoadModal navItemClass={navItemClass}></NeoLoadModal>
<NeoShareModal navItemClass={navItemClass}></NeoShareModal>
<NeoExtensionsModal navItemClass={navItemClass}></NeoExtensionsModal>
{renderDrawerExtensionsButtons()}
<SideNavigationGroupHeader>Learn</SideNavigationGroupHeader>
<NeoReportExamplesModal
extensions={extensions}
examples={getExampleReports(extensions)}
database={connection.database}
navItemClass={navItemClass}
></NeoReportExamplesModal>
{renderDrawerExtensionsButton()}

<Tooltip title='Documentation' aria-label='documentation'>
<SideNavigationItem
href='https://neo4j.com/labs/neodash/2.3/user-guide/'
Expand Down
Loading