diff --git a/.github/workflows/patch-release.yaml b/.github/workflows/prerelease.yaml similarity index 68% rename from .github/workflows/patch-release.yaml rename to .github/workflows/prerelease.yaml index af2f884c..0e14221a 100644 --- a/.github/workflows/patch-release.yaml +++ b/.github/workflows/prerelease.yaml @@ -1,4 +1,4 @@ -name: Patch release 🚀 +name: Publish a new prerelease 🚀 on: workflow_dispatch: @@ -10,10 +10,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + with: + token: ${{ secrets.GIT_PUSH_PAT }} - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.9" + python-version: '3.9' - name: Install and configure Poetry uses: snok/install-poetry@v1 @@ -34,8 +36,8 @@ jobs: echo Version: ${{ steps.get-version.outputs.version }} - uses: EndBug/add-and-commit@v9 with: - author_name: "Neo4j-GenAI GitHub Action" - author_email: "team-gen-ai@neo4j.com" - message: "Bump version to ${{ steps.get-version.outputs.version }}" - add: "pyproject.toml" - tag: "${{ steps.get-version.outputs.version }}" + author_name: 'Neo4j-GenAI GitHub Action' + author_email: 'team-gen-ai@neo4j.com' + message: 'Bump version to ${{ steps.get-version.outputs.version }}' + add: 'pyproject.toml' + tag: '${{ steps.get-version.outputs.version }}' diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3980af8b..97f3677f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,3 +4,11 @@ repos: hooks: - id: trailing-whitespace - id: end-of-file-fixer + - repo: local + hooks: + - id: ruff-lint + name: Ruff Lint Check + entry: poetry run ruff format --check + language: system + types: [ python ] + stages: [ commit, push ] diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a3047dea..42ad4749 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,7 +54,7 @@ Remember that many community members have become regular contributors and some a ## Specifically for this project Setting up the development environment: -1. Install Python 3.9.1+ +1. Install Python 3.8.1+ 2. Install poetry (see https://python-poetry.org/docs/#installation) 3. Install dependencies: diff --git a/README.md b/README.md index df703935..490556c1 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ and/or [Discord](https://discord.gg/neo4j). ### Make changes 1. Fork the repository. -2. Install Python and Poetry. For more information, see [the development guide](./docs/contributing/DEVELOPING.md). +2. Install Python and Poetry. 3. Create a working branch from `main` and start with your changes! ### Pull request diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..8f86c88e --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,194 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +VERSION = 0.1.2 +PRODUCT = neo4j-genai-python +SPHINXOPTS = +SPHINXBUILD = poetry run sphinx-build +PAPER = +BUILDDIR = build + +# User-friendly check for sphinx-build via Poetry +ifeq ($(shell poetry run which sphinx-build >/dev/null 2>&1; echo $$?), 1) +$(error The 'sphinx-build' command was not found within the Poetry environment. Make sure Sphinx is installed in your project dependencies.) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/$(PRODUCT)/$(VERSION) + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/$(PRODUCT)/$(VERSION)." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Neo4jBoltDriverforPython.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Neo4jBoltDriverforPython.qhc" + +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Neo4jBoltDriverforPython" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Neo4jBoltDriverforPython" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..fd8f5ffd --- /dev/null +++ b/docs/README.md @@ -0,0 +1,16 @@ +# Sphinx Documentation + +Building the docs requires Python 3.8.1+ + +Ensure the dev dependencies in `pyproject.toml` are installed. + +From the root directory, run the Makefile: + +``` +make -C docs html +``` + +You can now view your build locally. + +When you open a PR, a TeamCity build will trigger when it's ready and someone from Neo4j +can then preview this. diff --git a/docs/source/api.rst b/docs/source/api.rst new file mode 100644 index 00000000..4e010932 --- /dev/null +++ b/docs/source/api.rst @@ -0,0 +1,42 @@ +.. _api-documentation: + +API Documentation +################# + +************************************ +Retrieval-Augmented Generation (RAG) +************************************ +RAG is a technique that enhances Large Language Model (LLM) responses by retrieving +source information from external data stores to augment generated responses. + +This package enables Python developers to perform RAG using Neo4j. + +********** +Retrievers +********** + +VectorRetriever +=============== + +.. autoclass:: neo4j_genai.retrievers.vector.VectorRetriever + :members: + +VectorCypherRetriever +===================== + +.. autoclass:: neo4j_genai.retrievers.vector.VectorCypherRetriever + :members: + + +HybridRetriever +=============== + +.. autoclass:: neo4j_genai.retrievers.hybrid.HybridRetriever + :members: + + +HybridCypherRetriever +===================== + +.. autoclass:: neo4j_genai.retrievers.hybrid.HybridCypherRetriever + :members: diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 00000000..7eda6a97 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,103 @@ +# Copyright (c) "Neo4j" +# Neo4j Sweden AB [https://neo4j.com] +# # +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# # +# https://www.apache.org/licenses/LICENSE-2.0 +# # +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import sys +import typing + +# Add the root of the project to the path so that Sphinx can find the Python sources +sys.path.append(os.path.join(os.path.dirname(__file__), "..", "..", "src")) + +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = "neo4j-genai-python" +copyright = "2024, Neo4j, Inc." +author = "Neo4j, Inc." + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.doctest", + "sphinx.ext.todo", + "sphinx.ext.coverage", + "sphinx.ext.ifconfig", + "sphinx.ext.intersphinx", + "sphinx.ext.napoleon", + "sphinx.ext.viewcode", +] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = ".rst" + +# The master toctree document. +master_doc = "index" + +intersphinx_mapping = { + "python": ("https://docs.python.org/3", None), +} + +templates_path = ["_templates"] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = "neo4j" +html_theme_path = ["themes"] + +# The name of the Pygments (syntax highlighting) style to use. +# pygments_style = "sphinx" +pygments_style = "friendly" + +# Don't include type hints in function signatures +autodoc_typehints = "description" + +autodoc_type_aliases = { + # The code-base uses `import typing_extensions as te`. + # Re-write these to use `typing` instead, as Sphinx always resolves against + # the latest version of the `typing` module. + # This is a work-around to make Sphinx resolve type hints correctly, even + # though we're using `from __future__ import annotations`. + "te": typing, + # Type alias that's only defined and imported if `typing.TYPE_CHECKING` + # is `True`. + "_TAuth": "typing.Tuple[typing.Any, typing.Any] | Auth | None", +} + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +html_theme_options = { + "sidebar_includehidden": True, + "sidebar_collapse": True, +} + +autodoc_default_options = { + "member-order": "bysource", + # 'special-members': '__init__', + "undoc-members": True, + "exclude-members": "__weakref__", +} diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 00000000..03467542 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,275 @@ +.. neo4j-genai-python documentation master file, created by + sphinx-quickstart on Tue Apr 9 16:36:43 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Neo4j GenAI package for Python +============================== + +This repository contains the official Neo4j GenAI features for Python. + +The purpose of this package is to provide a first party package to developers, +where Neo4j can guarantee long term commitment and maintenance as well as being +fast to ship new features and high performing patterns and methods. + +****** +Topics +****** + ++ :ref:`api-documentation` ++ :ref:`types-documentation` + +.. toctree:: + :maxdepth: 3 + :caption: Contents: + :hidden: + + api.rst + types.rst + + +Usage +===== + +************ +Installation +************ + +This package requires Python (>=3.8.1). + +To install the latest stable version, use: + +.. code:: bash + + pip install neo4j-genai + + +.. note:: + + It is always recommended to install python packages for user space in a virtual environment. + +******** +Examples +******** + +While the library has more retrievers than shown here, the following examples should be able to get you started. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Performing a similarity search +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + from neo4j import GraphDatabase + from neo4j_genai import VectorRetriever + from langchain_openai import OpenAIEmbeddings + + URI = "neo4j://localhost:7687" + AUTH = ("neo4j", "password") + + INDEX_NAME = "embedding-name" + + # Connect to Neo4j database + driver = GraphDatabase.driver(URI, auth=AUTH) + + # Create Embedder object + embedder = OpenAIEmbeddings(model="text-embedding-3-large") + + # Initialize the retriever + retriever = VectorRetriever(driver, INDEX_NAME, embedder) + + # Run the similarity search + query_text = "How do I do similarity search in Neo4j?" + response = retriever.search(query_text=query_text, top_k=5) + +.. note:: + + Assumption: Neo4j running with populated vector index in place. + +~~~~~~~~~~~~~~~~~~~~~~~ +Creating a vector index +~~~~~~~~~~~~~~~~~~~~~~~ + +When creating a vector index, make sure you match the number of dimensions in the index with the number of dimensions the embeddings have. + +.. code:: python + + from neo4j import GraphDatabase + from neo4j_genai.indexes import create_vector_index + + URI = "neo4j://localhost:7687" + AUTH = ("neo4j", "password") + + INDEX_NAME = "chunk-index" + + # Connect to Neo4j database + driver = GraphDatabase.driver(URI, auth=AUTH) + + # Creating the index + create_vector_index( + driver, + INDEX_NAME, + label="Document", + property="textProperty", + dimensions=1536, + similarity_fn="euclidean", + ) + +.. note:: + + Assumption: Neo4j running + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Populating the Neo4j Vector Index +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This library does not write to the database, that is up to you. +See below for how to write using Cypher via the Neo4j driver. + +.. code:: python + + from neo4j import GraphDatabase + from random import random + + URI = "neo4j://localhost:7687" + AUTH = ("neo4j", "password") + + # Connect to Neo4j database + driver = GraphDatabase.driver(URI, auth=AUTH) + + # Upsert the vector + vector = [random() for _ in range(DIMENSION)] + insert_query = ( + "MERGE (n:Document {id: $id})" + "WITH n " + "CALL db.create.setNodeVectorProperty(n, 'textProperty', $vector)" + "RETURN n" + ) + parameters = { + "id": 0, + "vector": vector, + } + driver.execute_query(insert_query, parameters) + + +.. note:: + + Assumption: Neo4j running with a defined vector index + +Development +=========== + +******************** +Install dependencies +******************** + +.. code:: bash + + poetry install + +*************** +Getting started +*************** + +~~~~~~ +Issues +~~~~~~ + +If you have a bug to report or feature to request, first +`search to see if an issue already exists `_. +If a related issue doesn't exist, please raise a new issue using the relevant +`issue form `_. + +If you're a Neo4j Enterprise customer, you can also reach out to `Customer Support `_. + +If you don't have a bug to report or feature request, but you need a hand with +the library; community support is available via `Neo4j Online Community `_ +and/or `Discord `_. + +~~~~~~~~~~~~ +Make changes +~~~~~~~~~~~~ + +1. Fork the repository. +2. Install Python and Poetry. +3. Create a working branch from `main` and start with your changes! + +~~~~~~~~~~~~ +Pull request +~~~~~~~~~~~~ + +When you're finished with your changes, create a pull request, also known as a PR. + +- Ensure that you have `signed the CLA `_. +- Ensure that the base of your PR is set to `main`. +- Don't forget to `link your PR to an issue `_ + if you are solving one. +- Enable the checkbox to `allow maintainer edits `_ + so that maintainers can make any necessary tweaks and update your branch for merge. +- Reviewers may ask for changes to be made before a PR can be merged, either using + `suggested changes `_ + or normal pull request comments. You can apply suggested changes directly through + the UI, and any other changes can be made in your fork and committed to the PR branch. +- As you update your PR and apply changes, mark each conversation as `resolved `_. + +********* +Run tests +********* + +Open a new virtual environment and then run the tests. + +.. code:: bash + + poetry shell + pytest + +~~~~~~~~~~ +Unit tests +~~~~~~~~~~ + +This should run out of the box once the dependencies are installed. + +.. code:: bash + + poetry run pytest tests/unit + +~~~~~~~~~ +E2E tests +~~~~~~~~~ + +To run e2e tests you'd need to have some services running locally: + +- neo4j +- weaviate +- weaviate-text2vec-transformers + +The easiest way to get it up and running is via Docker compose: + +.. code:: bash + + docker compose -f tests/e2e/docker-compose.yml up + + +.. note:: + + If you suspect something in the databases are cached, run `docker compose -f tests/e2e/docker-compose.yml down` to remove them completely + +Once the services are running, execute the following command to run the e2e tests. + +.. code:: bash + + poetry run pytest tests/e2e + +******************* +Further information +******************* + +- `The official Neo4j Python driver `_ +- `Neo4j GenAI integrations `_ + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/source/themes/neo4j/footer.html b/docs/source/themes/neo4j/footer.html new file mode 100644 index 00000000..92ce58f1 --- /dev/null +++ b/docs/source/themes/neo4j/footer.html @@ -0,0 +1,43 @@ + diff --git a/docs/source/themes/neo4j/indexnav.html b/docs/source/themes/neo4j/indexnav.html new file mode 100644 index 00000000..67471187 --- /dev/null +++ b/docs/source/themes/neo4j/indexnav.html @@ -0,0 +1,13 @@ + diff --git a/docs/source/themes/neo4j/layout.html b/docs/source/themes/neo4j/layout.html new file mode 100644 index 00000000..cefef299 --- /dev/null +++ b/docs/source/themes/neo4j/layout.html @@ -0,0 +1,62 @@ +{%- extends "basic/layout.html" %} + +{% set favicon_url = 'https://neo4j.com/wp-content/themes/neo4jweb/favicon.ico' %} + +{# removed existing top+bottom related nav #} +{%- block relbar1 %}{% endblock %} +{%- block relbar2 %}{% endblock %} + +{% block extrahead %} + +{% endblock %} + +{%- block content %} + + +{%- block document %} + +
+ +
+ + +
+ {% block sidebar1 %}{{ sidebar() }}{% endblock %} +
+ +
+
+ {% block body %} {% endblock %} + +
+
+ +
+
+{%- endblock %} + +{%- endblock %} + +{%- block footer %} + {% include "footer.html" %} + {% if disable_tracking != false %} + + {% endif %} +{%- endblock %} + diff --git a/docs/source/themes/neo4j/navigation.html b/docs/source/themes/neo4j/navigation.html new file mode 100644 index 00000000..261759c0 --- /dev/null +++ b/docs/source/themes/neo4j/navigation.html @@ -0,0 +1,11 @@ + diff --git a/docs/source/themes/neo4j/static/css/neo4j.css_t b/docs/source/themes/neo4j/static/css/neo4j.css_t new file mode 100644 index 00000000..39bf6148 --- /dev/null +++ b/docs/source/themes/neo4j/static/css/neo4j.css_t @@ -0,0 +1,558 @@ +@import "site.css"; + +#auth { + padding-left: initial; +} + +.doc h1 { + font-size: 1.75em; +} + +.doc p { + margin-block-start: 1em; + margin-block-end: 1em; + margin-inline-start: 0; + margin-inline-end: 0; +} + +.sphinx pre { + line-height: 1.3; +} + +.sphinx pre:not(.highlight) { + padding-top: 1rem; + padding-bottom: 1rem; +} + +html.is-clipped--nav #searchbox { + display: none !important; +} + +body.sphinx .navbar-link a { + color: #3182ce; +} + + +body.sphinx a.external::after { + display: inline-block; + content: ""; + padding: 0; + margin: 0; + background-position: 50%; +} + +body.sphinx #searchbox { + padding: 0 1.5rem 0.5rem; +} + +body.sphinx #indexlinkbox { + padding: 0 1.5rem 0.5rem 0; +} + +body.sphinx #indexlinkbox .indexlinkwrapper > ul:first-child { + margin-top: 0; +} + +#indexlinklabel { + padding-left: 1.5rem; +} + +body.sphinx #searchlabel, +body.sphinx #indexlinklabel { + margin: 0.8rem 0 0.5rem; +} + +body.sphinx #searchlabel, +body.sphinx #indexlinklabel { + margin: 0.8rem 0 0.5rem; +} + +body.sphinx #searchbox .search, +body.sphinx .content .search { + display: block; + opacity: 1; + position: relative; + background: initial; +} + +@media screen and (min-width: 1024px) { + + body.sphinx .toolbar { + background: initial; + box-shadow: none; + height: 0; + } + + .navbar-item, .navbar-link { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + + body.sphinx .nav-container { + border: none; + } + + body.sphinx .nav, + body.sphinx .nav-panel-menu { + height: auto; + background: initial; + } + + body.sphinx .sphinxsidebar { + background: #f5f7fa; + position: static; + } + + body.sphinx .sphinxsidebarwrapper { + position: sticky; + top: 3.77778rem; + height: calc(100vh - 3.77778rem); + overflow-y: auto; + } + + body.sphinx .nav-panel-menu:not(.is-active)::after { + background: initial; + } + + body.sphinx .navbar-start { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + max-width: 63.11111rem; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin-right: 2rem; + } + + body.sphinx .navbar-start .navbar-link { + margin-left: auto; + } +} + +.navbar-item, .navbar-link { + color: #4a5568; + line-height: 1.8; + padding: 0.5rem 1rem; + position: relative; +} + +@media screen and (min-width: 769px) { + .doc>.sect-header>h1.page:first-child { + margin-top: 2.5rem; + } +} + +.doc>section>h1:first-child { + font-size: 2rem; + margin: 1.5rem 0.5rem 1.5rem 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} +.doc h1, .doc h2, .doc h3, .doc h4, .doc h5, .doc h6 { + color: #4a5568; + font-weight: 400; + -webkit-hyphens: none; + -ms-hyphens: none; + hyphens: none; + line-height: 1.3; + margin: 2rem 0 1rem; +} + +.doc a.headerlink { + visibility: hidden; + margin-left: 0.5rem; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +.nav-menu .caption { + padding: 0.5rem 1.5rem; + font-size: 1.5rem; +} + +.nav-menu ul { + padding-left: 0; +} + + +{% for level in range(1, 4) %} +.nav-menu li.toctree-l{{ level }} { + list-style: none; + position: relative; +} + +.nav-menu .toctree-l{{ level }}>a, +.nav-menu .toctree-l{{ level }}>span { + padding-left: {{ level }}.5rem; +} + +.nav-menu .toctree-l{{ level }}>a, +.nav-menu .toctree-l{{ level }}>span { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.nav-menu .toctree-l{{ level }} a:hover, +.nav-menu .toctree-l{{ level }} span:hover { + background-color: #e6e9ee; +} + +.nav-menu .toctree-l{{ level }}>a.current { + background-color: #e6f8ff; + color: #0056b3; +} + +.nav-menu .toctree-l{{ level }}>a.current::before { + content: ""; + width: 4px; + height: 100%; + position: absolute; + left: 0; + top: 0; + background: #0056b3; + border-radius: 4px; +} + +.toctree-l{{ level }}>a, .toctree-l{{ level }}>span { + position: relative; + padding-right: 2rem; +} +{% endfor %} + +.nav-menu li a code { + font-family: inherit +} + +.is-current-page>.nav-link, +.is-current-page>.nav-text { + font-weight: 400; +} + +.nav-menu a, .nav-text { + color: #535b66; + font-weight: 400; + display: block; + padding: 0.25rem 0; +} + +/* lists */ + +body.sphinx .doc ul li{ + margin-bottom: 0; +} + +/* functions */ + +body.sphinx .doc dl.py.function { + padding: 0 1rem; + /* border-top: 2px dotted #eee; */ +} + +/* deprecated */ + +body.sphinx .deprecated::after, +body.sphinx .deprecated > *::after { + content: unset; +} + +body.sphinx .doc dl.deprecated dt:first-of-type span.sig-prename, +body.sphinx .doc dl.deprecated dt:first-of-type span.sig-name { + border-bottom: 1px solid #f6ad55; + /* color: #702459; */ + /* background-color: #fed7e2; */ +} + +body.sphinx .doc dl.deprecated { + margin-bottom: 0; + padding-bottom: 0; +} + +body.sphinx .doc div.deprecated { + padding: 1rem 1rem 0.75rem; + margin: 0.5rem 1.5rem; + /* color: #702459; */ + border-left: 4px solid #f6ad55; + border-radius: .25rem; + background-color: #fffaf0; +} + +.sphinx .doc .deprecated > :first-child { + margin-top: 0; +} + +.sphinx .doc .deprecated > :last-child { + margin-bottom: 0; +} + +b, strong { + font-weight: 800; +} + +dt { + font-weight: initial; +} + +.sphinx .doc .admonition { + margin: 0.5rem 1.5rem; + border-left: 4px solid #2d3748; + border-radius: .25rem; + padding: 1rem 1rem 0.75rem; + font-size: .88889rem +} + +.sphinx .doc .admonition .admonition-title:after { + content: ":"; +} + +.sphinx .doc .admonition .admonition-title, +.sphinx .doc .admonition .admonition-title + p { + display: inline; +} + +.sphinx .doc .admonition > :last-child { + margin-bottom: 0; +} + +.sphinx .doc .admonition > table { + border-collapse: collapse; + table-layout: fixed; + position: relative; + width: 100% +} + +.sphinx .doc .admonition .content { + padding: 1rem 1rem .75rem; + width: 100% +} + +.sphinx .doc .admonition .listingblock .content { + padding: 0 +} + +.sphinx .doc .admonition .icon { + display: none +} + +.sphinx .doc .admonition a.btn { + display: inline-block; + background: #000; + color: #fff !important; + padding: .5rem 2rem; + border-radius: .5rem +} + +.sphinx .doc .admonition a.btn::after { + display: none !important +} + +.sphinx .doc .admonition.warning { + background-color: #fed7d7; + color: #742a2a; + border-left-color: #e53e3e +} + +.sphinx .doc .admonition.warning pre { + background-color: #fff5f5; + color: #c53030 +} + +.sphinx .doc .admonition.warning a.btn { + background-color: #e53e3e +} + +.sphinx .doc .admonition.warning a { + color: #f56565 +} + +.sphinx .doc .admonition.caution { + background-color: #feebc8; + color: #7b341e; + border-left-color: #dd6b20 +} + +.sphinx .doc .admonition.caution a { + color: #ed8936 +} + +.sphinx .doc .admonition.caution a:hover { + color: #f6ad55 +} + +.sphinx .doc .admonition.caution a.btn { + background-color: #dd6b20 +} + +.sphinx .doc .admonition.caution pre { + background-color: #fffaf0; + color: #c05621 +} + +.sphinx .doc .admonition.tip, .sphinx .doc .admonition.note { + background-color: #bee3f8; + color: #2a4365; + border-left-color: #3182ce +} + +.sphinx .doc .admonition.tip a, .sphinx .doc .admonition.note a { + color: #3182ce +} + +.sphinx .doc .admonition.tip a:hover, .sphinx .doc .admonition.note a:hover { + color: #4299e1 +} + +.sphinx .doc .admonition.tip a.btn, .sphinx .doc .admonition.note a.btn { + background-color: #3182ce +} + +.sphinx .doc .admonition.tip pre, .sphinx .doc .admonition.note pre { + background-color: #ebf8ff; + color: #2b6cb0 +} + +.sphinx .doc .admonition.seealso { + background-color: #edf2f7; + color: #1a202c; + border-left-color: #718096 +} + +.sphinx .doc .admonition.seealso a { + color: #718096 +} + +.sphinx .doc .admonition.seealso a:hover { + color: #a0aec0 +} + +.sphinx .doc .admonition.seealso a.btn { + background-color: #718096 +} + +.sphinx .doc .admonition.important { + background-color: #e9d8fd; + color: #44337a; + border-left-color: #805ad5 +} + +.sphinx .doc .admonition.important a { + color: #805ad5 +} + +.sphinx .doc .admonition.important a:hover { + color: #9f7aea +} + +.sphinx .doc .admonition.important a.btn { + background-color: #805ad5 +} + +dd > :first-child { + margin-top: 0; +} + +.field-list p { + margin: 0; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + /*word-break: break-word;*/ + padding-left: 0.5em; + padding-right: 5px; +} + + +dl.field-list > dd { + padding-left: 0.5em; + margin-left: 0; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dl.field-list > dd > ul, +dl.field-list > dd > ol { + padding-left: 1.9em; + margin-left: 0; +} + +.content ol li > p:first-of-type, +.content ul li > p:first-of-type { + margin-top: 0; +} + +.content ol li > p:last-of-type, +.content ul li > p:last-of-type { + margin-bottom: 0; +} + + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border: 0; +} + +table.docutils > tbody > tr:not(:last-child) > td, +table.docutils > tbody > tr:not(:last-child) > td, +table.docutils > thead > tr:not(:last-child) > td, +table.docutils > thead > tr:not(:last-child) > td, +table.docutils > tr:not(:last-child) > td, +table.docutils > tr:not(:last-child) > td { + border-bottom: 1px solid #aaa; +} + +th > :first-child, +td > :first-child { + margin-top: 0; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0; +} + +.sig-name, code.descname { + font-weight: bold; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} diff --git a/docs/source/themes/neo4j/static/css/nunito-sans.css b/docs/source/themes/neo4j/static/css/nunito-sans.css new file mode 100644 index 00000000..dfd39b79 --- /dev/null +++ b/docs/source/themes/neo4j/static/css/nunito-sans.css @@ -0,0 +1,200 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 300; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-cyrillic-ext.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 300; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-cyrillic.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 300; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-vietnamese.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 300; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 300; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-cyrillic-ext.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-cyrillic.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-vietnamese.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 600; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-cyrillic-ext.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 600; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-cyrillic.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 600; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-vietnamese.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 600; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 600; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-cyrillic-ext.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-cyrillic.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-vietnamese.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito Sans'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(../fonts/nunito-sans-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/docs/source/themes/neo4j/static/css/site.css b/docs/source/themes/neo4j/static/css/site.css new file mode 100644 index 00000000..8b2488b7 --- /dev/null +++ b/docs/source/themes/neo4j/static/css/site.css @@ -0,0 +1,8 @@ +/* https://neo4j.com/docs/assets/css/site.css */ + +@font-face{font-family:Roboto Mono;font-style:normal;font-weight:400;src:local("Roboto Mono"),local("RobotoMono-Regular"),url(https://neo4j.com/docs/assets/font/roboto-mono-latin-400.woff2) format("woff2"),url(https://neo4j.com/docs/assets/font/roboto-mono-latin-400.woff) format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-weight:500;src:local("Roboto Mono Medium"),local("RobotoMono-Medium"),url(https://neo4j.com/docs/assets/font/roboto-mono-latin-500.woff2) format("woff2"),url(https://neo4j.com/docs/assets/font/roboto-mono-latin-500.woff) format("woff")}body,html{height:100%}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}html{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:1.0625em;-webkit-text-size-adjust:100%}@media screen and (min-width:1024px){html{font-size:1em}}body{background:#fff;color:#4a5568;font-family:Nunito Sans,Helvetica Neue,helvetica,roboto,arial,sans-serif;line-height:1.5;margin:0}a{text-decoration:none}a:active{background-color:none}code,kbd,pre{font-family:Roboto Mono,monospace}b,dt,strong,th{font-weight:600}em em{font-style:normal}strong strong{font-weight:400}button{cursor:pointer;font-family:inherit;font-size:1em;line-height:1.5;margin:0}button::-moz-focus-inner{border:none;padding:0}.body{word-wrap:break-word}@media screen and (min-width:1024px){.body{display:-webkit-box;display:-ms-flexbox;display:flex}}.nav-container{position:fixed;top:3.77778rem;left:0;width:100%;font-size:.94444rem;z-index:1;visibility:hidden}@media screen and (min-width:769px){.nav-container{width:18rem}}@media screen and (min-width:1024px){.nav-container{font-size:.875rem;-webkit-box-flex:0;-ms-flex:none;flex:none;position:static;top:0;visibility:visible;border-right:1px solid #edf2f7}}.nav-container.is-active{visibility:visible}.nav{background:#f5f7fa;position:relative;top:2.5rem;height:calc(100vh - 6.27778rem);font-weight:400}@media screen and (min-width:769px){.nav{-webkit-box-shadow:.5px 0 3px #edf2f7;box-shadow:.5px 0 3px #edf2f7}}@media screen and (min-width:1024px){.nav{top:3.77778rem;-webkit-box-shadow:none;box-shadow:none;position:sticky;height:calc(100vh - 3.77778rem)}}.nav .panels{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:inherit}html.is-clipped--nav{overflow-y:hidden}@media screen and (max-width:1023px){html.is-clipped--nav .toolbar{position:fixed;width:100%}}.nav-panel-menu{overflow-y:scroll;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 8.77778rem)}@media screen and (min-width:1024px){.nav-panel-menu{height:calc(100vh - 6.27778rem)}}.nav-panel-menu:not(.is-active) .nav-menu{opacity:.75}.nav-panel-menu:not(.is-active)::after{content:"";background:rgba(0,0,0,.5);display:block;position:absolute;top:0;right:0;bottom:0;left:0}.nav-panel-explore .components,.nav-panel-menu{scrollbar-width:thin;scrollbar-color:#f7fafc transparent}.nav-panel-explore .components::-webkit-scrollbar,.nav-panel-menu::-webkit-scrollbar{width:.25rem}.nav-panel-explore .components::-webkit-scrollbar-thumb,.nav-panel-menu::-webkit-scrollbar-thumb{background-color:#f7fafc}.nav-menu{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;min-height:0;width:100%;line-height:1.2;position:relative}.nav-menu .component-title{display:block}.nav-menu .title{color:#535b66;font-weight:300;letter-spacing:1.5px;text-transform:uppercase;font-size:.75rem;line-height:1.35;border-bottom:1px solid #e6e9ee;padding:.5rem 1.5rem;margin:0;font-family:Nudista,Helvetica Neue,helvetica,roboto,arial,sans-serif}.nav-menu a,.nav-text{color:#535b66;font-weight:400;display:block;padding:.25rem 0}.nav-list{margin:0;padding:0}.nav-menu>.nav-list{margin-top:.5rem}.nav-item{list-style:none;position:relative}.nav-list:first-child strong{margin-top:0!important}.nav-item-toggle~.nav-list{padding-bottom:.125rem}.nav-item[data-depth="0"]>.nav-list:first-child{display:block;margin:0}.nav-item:not(.is-active)>.nav-list{display:none}.nav-item-toggle{cursor:pointer}.is-current-page>.nav-link,.is-current-page>.nav-text{font-weight:400}.nav-item.is-current-page::before,.nav-item:hover::before,.toc-menu li a::before{opacity:1}.nav-panel-explore{background:#f5f7fa;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;position:absolute;right:0;bottom:0;left:0;max-height:calc(50% + 2.5rem)}.nav-panel-explore,.nav-panel-explore .context{display:-webkit-box;display:-ms-flexbox;display:flex}.nav-panel-explore .context{font-size:.83333rem;-ms-flex-negative:0;flex-shrink:0;color:#cbd5e0;-webkit-box-shadow:0 -1px 0 #edf2f7;box-shadow:0 -1px 0 #edf2f7;padding:0 .25rem 0 .5rem;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;cursor:pointer;line-height:1;height:2.5rem}.nav-panel-explore .context .version{background-image:url(https://neo4j.com/docs/assets/img/chevron.svg);background-repeat:no-repeat;background-position:right .5rem top 50%;background-size:auto .75em;padding:0 1.5rem 0 0}.nav-panel-explore .components{line-height:1.8;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-shadow:inset 0 1px 5px #edf2f7;box-shadow:inset 0 1px 5px #edf2f7;background:#e2e8f0;padding:.5rem .75rem 0;margin:0;overflow-y:scroll;max-height:100%;display:block}.nav-panel-explore:not(.is-active) .components{display:none}.nav-panel-explore .component{display:block}.nav-panel-explore .component+.component{margin-top:.5rem}.nav-panel-explore .component:last-child{margin-bottom:.75rem}.nav-panel-explore .component .title{font-weight:600}.nav-panel-explore .versions{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;padding-left:0;margin-top:-.25rem;line-height:1}.nav-panel-explore .component .version{display:block;margin:.375rem .375rem 0 0}.nav-panel-explore .component .version a{border:1px solid #edf2f7;border-radius:.25rem;color:inherit;opacity:.75;white-space:nowrap;padding:.125em .25em;display:inherit}.nav-panel-explore .component .is-current a{border-color:currentColor;opacity:.9;font-weight:600}.nav .label{font-size:.8rem}.navbar .navbar-item.getting-started-cta .navbar-link{border-radius:.25rem;padding:.5em 1.5em;font-weight:400;text-align:center}@media screen and (min-width:1024px){.navbar .navbar-item.getting-started-cta{padding-right:0}}.nav-item .nav-text strong{font-size:16px;font-weight:700}.nav-link{position:relative}.nav-item a:hover,.nav-item span:hover{background-color:#e6e9ee}.is-current-page.is-active>a{background-color:#e6f8ff;color:#0056b3}.is-current-page.is-active>a::before{content:"";width:4px;height:100%;position:absolute;left:0;top:0;background:#0056b3;border-radius:4px}.nav-menu .nav-item>a,.nav-menu .nav-item>span{padding-top:.5rem;padding-bottom:.5rem}.nav-item>a,.nav-item>span{position:relative;padding-right:2rem}.nav-item[data-depth="0"]>a,.nav-item[data-depth="0"]>span{padding:.5rem 2rem .5rem 1rem}.nav-item[data-depth="1"]>a,.nav-item[data-depth="1"]>span{padding-left:1.5rem}.nav-item[data-depth="2"]>a,.nav-item[data-depth="2"]>span{padding-left:2.5rem}.nav-item[data-depth="3"]>a,.nav-item[data-depth="3"]>span{padding-left:3.5rem}.nav-item[data-depth="4"]>a,.nav-item[data-depth="4"]>span{padding-left:4.5rem}.nav-item[data-depth="5"]>a,.nav-item[data-depth="5"]>span{padding-left:5.5rem}.nav-item[data-depth="1"]>span strong{font-size:1rem;color:var(--neutral-55)}.nav-item>.nav-item-toggle::after{content:"";position:absolute;right:.5rem;top:.5rem;background:url(https://neo4j.com/docs/assets/img/chevron.svg) no-repeat;background-position:50%;background-size:auto .75em;width:1.5rem;height:50%}.nav-item.is-active>.nav-item-toggle:not(a)::after{-webkit-transform:scaleY(-1)}.nav-item.is-active>a.nav-item-toggle::after{background:none}.nav-item a[target=_blank]:hover::after{position:relative;display:inline-block;margin:0 .2rem;content:"→";color:#805ad5;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transition:all .2s linear;transition:all .2s linear;top:0}.nav-item .nav-section-header{margin-top:1.5rem;margin-bottom:.5rem;padding-top:1.5rem!important;border-top:1px solid var(--colors-netural-25)}.nav-item .nav-section-header:hover{background-color:transparent}.nav-menu .nav-list:first-child .nav-item:first-child .nav-section-header{border:none;padding-top:0!important}.nav-panel-versions{height:2.5rem;padding:.25rem .5rem}.nav-panel-versions .dropdown .dropdown-styles{width:100%}.dropdown-styles{display:grid;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:.5rem 28px .5rem .5rem;border-radius:4px;border:1px solid #c4c8cd;background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='20' height='20' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='%23535B66'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M19.5 8.25l-7.5 7.5-7.5-7.5'/%3E%3C/svg%3E");background-position:right 5px top 50%;background-repeat:no-repeat;text-overflow:ellipsis}.dropdown-styles::after{grid-area:select}.dropdown-styles::-ms-expand{display:none}.dropdown .dropdown-label{display:none;color:#535b66}@media screen and (max-width:1023px){aside.kb-metadata.sidebar,aside.toc.sidebar{display:none}}@media screen and (min-width:1024px){main{-webkit-box-flex:1;-ms-flex:auto;flex:auto;min-width:0}main>.content{display:-webkit-box;display:-ms-flexbox;display:flex}aside.toc.embedded{display:none}aside.toc.sidebar{-webkit-box-flex:0;-ms-flex:0 0 9rem;flex:0 0 9rem}aside.kb-metadata.sidebar{-webkit-box-flex:0;-ms-flex:0 0 12rem;flex:0 0 12rem}}@media screen and (min-width:1216px){aside.toc.sidebar{-ms-flex-preferred-size:12rem;flex-basis:12rem}aside.kb-metadata.sidebar{-ms-flex-preferred-size:13.55556rem;flex-basis:13.55556rem}}.toolbar{color:#4a5568;background-color:#f7fafc;-webkit-box-shadow:0 1px 0 #edf2f7;box-shadow:0 1px 0 #edf2f7;font-size:.83333rem;height:2.5rem;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;position:sticky;top:3.77778rem;z-index:20}.toolbar,.toolbar-wrapper{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.toolbar-wrapper{width:100%;max-width:69rem}.toolbar a{color:inherit}.nav-toggle{background:url(https://neo4j.com/docs/assets/img/menu.svg) no-repeat 50% 47.5%;background-size:49%;border:none;outline:none;line-height:inherit;height:2.5rem;padding:0;width:2.5rem;margin-right:-.25rem}@media screen and (min-width:1024px){.nav-toggle{display:none}}.nav-toggle.is-active{background-image:url(https://neo4j.com/docs/assets/img/back.svg);background-size:41.5%}.home-link{background:url(https://neo4j.com/docs/assets/img/home-o.svg) no-repeat 50% 45%;background-size:50%;display:block;height:2.5rem;padding:0;width:2.5rem}.home-link.is-current,.home-link:hover{background-image:url(https://neo4j.com/docs/assets/img/home.svg)}.edit-this-page{display:none;padding-right:.5rem}@media screen and (min-width:1350px){.edit-this-page{padding-right:0}}@media screen and (min-width:1024px){.edit-this-page{display:block}}.toolbar .edit-this-page a{color:#a0aec0}.breadcrumbs{display:none;-webkit-box-flex:1;-ms-flex:1 1;flex:1 1;padding:0 .5rem 0 .75rem;line-height:1.2}@media screen and (min-width:1024px){.breadcrumbs{display:block}}a+.breadcrumbs{padding-left:.05rem}.breadcrumbs ul{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0;list-style:none}.breadcrumbs li{display:inline;margin:0}.breadcrumbs li::after{content:"/";padding:0 .5rem}.breadcrumbs li:last-of-type::after{content:none}.page-versions{display:none;margin-right:.7rem;position:relative;line-height:1}@media screen and (min-width:1024px){.page-versions{display:block}}.page-versions .version-menu-toggle{color:inherit;background:url(https://neo4j.com/docs/assets/img/chevron.svg) no-repeat;background-position:right .5rem top 50%;background-size:auto .75em;border:none;outline:none;line-height:inherit;padding:.5rem 1.5rem .5rem .5rem;position:relative;z-index:3}.page-versions .version-menu{background-color:#fff;border:1px solid #e2e8f0;border-radius:3px;padding:1.25rem .5rem .5rem;position:absolute;top:0;left:0;width:100%}.page-versions:not(.is-active) .version-menu{display:none}.page-versions .version{display:block;padding-top:.5rem}.page-versions .version.is-current{display:none}.page-versions .version.is-missing{color:#e2e8f0;font-style:italic;text-decoration:none}.toc-menu{color:#4a5568;margin-bottom:2rem}.toc.sidebar{padding-right:1rem;padding-bottom:2rem;position:relative}.toc.sidebar .toc-menu{margin-right:.75rem;position:sticky;top:6.27778rem}.toc .toc-menu h2{color:#4a5568;font-size:.88889rem;font-weight:600;line-height:1.5;margin:1.5rem -.5px 0;padding:.5rem 0 .25rem}.toc.sidebar .toc-menu h3{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:2.5rem;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.toc .toc-menu ul{font-size:.83333rem;line-height:1.4;list-style:none;margin:0;padding:0}.toc.sidebar .toc-menu ul{max-height:calc(100vh - 14.77778rem);overflow-y:auto;scrollbar-width:none}.toc .toc-menu ul::-webkit-scrollbar{width:0}.toc .toc-menu li{margin:0}.toc .toc-menu li a{position:relative}.toc-menu li a::before{top:.25rem;left:0;margin-left:-.4em;opacity:0}.toc .toc-menu li[data-level="1"] a{padding-left:1rem}.toc .toc-menu li[data-level="2"] a{padding-left:2rem}.toc .toc-menu li[data-level="3"] a{padding-left:3rem}.toc .toc-menu a{color:inherit;border-left:1px solid #e2e8f0;display:inline-block;padding:.25rem 0 .25rem .5rem;text-decoration:none}.sidebar.toc .toc-menu a{display:block;outline:none}.toc .toc-menu a:hover{color:#4a5568}.toc .toc-menu a.is-active{color:#2b6cb0}.toc .toc-menu a.is-active::before{background:#3182ce}.toc .toc-menu a.is-active::before,.toc .toc-menu a:hover::before{opacity:1}.sidebar.toc .toc-menu a:focus{background:#f7fafc}.toc .toc-menu .is-hidden-toc{display:none!important}.toc-sidebar .toc-menu{margin-bottom:4rem}aside.toc.embedded{margin-bottom:1.5rem;border-bottom:1px solid #e2e8f0;padding-bottom:.5rem}.toc .toc-ad{border:1px solid #e2e8f0;padding:1rem .5rem;border-radius:.5rem;margin:2rem -.5rem 0}.toc .toc-ad a{padding:0!important;border-left:0!important}.toc .toc-ad a:active{background-color:#fff!important}.toc .toc-ad .toc-ad-overline{font-size:.7rem;color:#718096;text-transform:uppercase;background-color:#fff}.toc .toc-ad .toc-ad-overline a{padding-left:0!important;border-left:0!important;color:#718096}.toc .toc-ad .toc-ad-image{width:80%;margin:.2rem auto}.toc .toc-ad .toc-ad-overline a:hover{color:#2d3748}.toc .toc-ad .toc-ad-title{color:#3182ce;font-size:1rem;margin:.2rem 0!important;padding:0!important}.toc .toc-ad-description{color:#a0aec0;font-size:.8rem;margin-top:0}.toc .toc-ad-underline{color:#3182ce;font-weight:700;font-size:.8rem}.toc .toc-ad-underline-button,.toc .toc-ad .button{border-radius:.25rem;background-color:#3182ce;color:#fff;display:inline-block;font-size:.8rem;font-weight:700;padding:.5rem 1rem}.doc .ad{border:1px solid #e2e8f0;border-radius:.5rem;background:#fff;margin:2rem -1rem 0;padding:1rem;position:relative;z-index:1000}.doc .ad h2{font-size:.8rem!important;text-transform:uppercase;margin-top:0}.doc .ad h2,.doc .ad h2 a{color:#a0aec0}.doc .ad .anchor{display:none}.doc .ad a::after{display:none!important}.doc .ad h3{margin-bottom:.3rem}.doc .ad .paragraph{margin-bottom:.5rem}.doc .ad .paragraph:last-child p{margin-bottom:0}.doc .ad .paragraph a.button{font-size:.8rem;margin:0 1rem .2rem 0;padding:.25rem 1rem}.doc .ad .imageblock.left,.doc .ad .imageblock.right{width:20%!important;max-width:120px;margin:0 1.5rem 1rem 0!important}@media screen and (min-width:580px){.doc .ad.left{float:left;margin-right:1.5rem}.doc .ad.left,.doc .ad.right{max-width:50%;margin-bottom:2rem}.doc .ad.right{float:right;margin-left:1.5rem}.doc .ad.left::after,.doc .ad.right::after{content:"";display:block;clear:both}}.doc{color:#2d3748;font-size:inherit;line-height:1.8;margin:0 auto;max-width:40rem;padding:0 1rem 2rem}body{font-weight:400}@media screen and (min-width:1024px){.doc{-webkit-box-flex:1;-ms-flex:auto;flex:auto;font-size:.94444rem;margin:0 2rem;max-width:54.44444rem;min-width:0;padding-bottom:4rem}}.doc h1,.doc h2,.doc h3,.doc h4,.doc h5,.doc h6{color:#4a5568;font-weight:400;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;line-height:1.3;margin:2rem 0 1rem}.doc h1 code,.doc h2 code,.doc h3 code,.doc h4 code,.doc h5 code,.doc h6 code{padding:.125em .25em;background:#f7fafc}.doc h4,.doc h5{font-weight:600;font-size:1rem}.doc h5{margin-bottom:.5rem;color:#718096}.doc>.sect-header>h1.page:first-child{font-size:2rem;margin:1.5rem .5rem 1.5rem 0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}@media screen and (min-width:769px){.doc>.sect-header>h1.page:first-child{margin-top:2.5rem}}#preamble+.sect1,.doc .sect1+.sect1{margin-top:2rem}.doc h1.sect0{background:#fff;font-size:1.8em;margin:1.5rem -1rem 0;padding:.5rem 1rem}.doc h2:not(.discrete){border-bottom:1px solid #e2e8f0;padding:.4rem 0 .5rem}.doc h3:not(.discrete){font-weight:600}.doc h1 .anchor,.doc h2 .anchor,.doc h3 .anchor,.doc h4 .anchor,.doc h5 .anchor,.doc h6 .anchor{position:absolute;text-decoration:none;width:1.75ex;margin-left:-1.5ex;visibility:hidden;font-size:.8em;font-weight:400;padding-top:.05em}.doc h1 .anchor::before,.doc h2 .anchor::before,.doc h3 .anchor::before,.doc h4 .anchor::before,.doc h5 .anchor::before,.doc h6 .anchor::before{content:"\00a7"}.doc h1:hover .anchor,.doc h2:hover .anchor,.doc h3:hover .anchor,.doc h4:hover .anchor,.doc h5:hover .anchor,.doc h6:hover .anchor{visibility:visible}@media screen and (max-width:620px){.doc>.sect-header>h1.page:first-child{font-size:1.4rem;font-weight:600}.doc h2:not(.discrete){font-size:1.2rem}.doc h3{font-size:1.1rem}}.doc p{margin:0}.doc .tableblock p{font-size:inherit}.doc .tableblock .icon{display:inline-block;margin-right:.5rem}.doc a{font-weight:600;color:#3182ce}.doc a:hover,.doc a:hover code:hover{color:#805ad5}.doc code a{color:inherit}.doc i.fa{font-style:normal}.doc p code,.doc td code,.doc thead code{color:#4a5568;background:#f7fafc;border-radius:.25em;font-size:.95em;padding:.125em .25em}.doc pre{color:#4a5568;font-size:.88889rem;line-height:1.5;margin:0}.doc code::before{opacity:0}.doc blockquote{margin:0}.doc .right{float:right;margin-left:2rem}.doc .image.rounded{padding:12px;-webkit-box-shadow:0 0 5px 1px #bee3f8!important;box-shadow:0 0 5px 1px #bee3f8!important;background:#fff;border-radius:50%;line-height:1;display:inline-block}.doc .image.right{margin-left:1rem}.doc .image.left{margin-right:1rem}.doc .left{float:left}.doc .underline{text-decoration:underline}.doc .line-through{text-decoration:line-through}.doc .colist,.doc .dlist,.doc .exampleblock,.doc .imageblock,.doc .listingblock,.doc .literalblock,.doc .olist,.doc .paragraph,.doc .partintro,.doc .quoteblock,.doc .sidebarblock,.doc .ulist,.doc .verseblock{margin:0 0 1.5rem}.doc table.stretch{width:100%}.doc table.tableblock thead th{border-bottom:2.5px solid #edf2f7;padding:.5rem}.doc table.tableblock>:not(thead) th,.doc table.tableblock td{border-top:1px solid #edf2f7;border-bottom:1px solid #edf2f7;padding:.5rem}.doc .halign-left{text-align:left}.doc .halign-right{text-align:right}.doc .halign-center{text-align:center}.doc .valign-top{vertical-align:top}.doc .valign-bottom{vertical-align:bottom}.doc .valign-middle{vertical-align:middle}.doc .admonitionblock{margin:0 0 1.5rem;border-left:4px solid #2d3748;border-radius:.25rem}.doc .admonitionblock .content,.doc .admonitionblock p{font-size:.88889rem}.doc .admonitionblock .content>:last-child,.doc .admonitionblock .content>:only-child{margin:0}.doc .admonitionblock pre{font-size:.83333rem}.doc .admonitionblock>table{border-collapse:collapse;table-layout:fixed;position:relative;width:100%}.doc .admonitionblock .content{padding:1rem 1rem .75rem;width:100%}.doc .admonitionblock .listingblock .content{padding:0}.doc .admonitionblock .icon{display:none}.doc .admonitionblock a.btn{display:inline-block;background:#000;color:#fff!important;padding:.5rem 2rem;border-radius:.5rem}.doc .admonitionblock a.btn::after{display:none!important}.doc .admonitionblock.warning{background-color:#fed7d7;color:#742a2a;border-left-color:#e53e3e}.doc .admonitionblock.warning pre{background-color:#fff5f5;color:#c53030}.doc .admonitionblock.warning a.btn{background-color:#e53e3e}.doc .admonitionblock.warning a{color:#f56565}.doc .admonitionblock.caution{background-color:#feebc8;color:#7b341e;border-left-color:#dd6b20}.doc .admonitionblock.caution a{color:#ed8936}.doc .admonitionblock.caution a:hover{color:#f6ad55}.doc .admonitionblock.caution a.btn{background-color:#dd6b20}.doc .admonitionblock.caution pre{background-color:#fffaf0;color:#c05621}.doc .admonitionblock.tip{background-color:#bee3f8;color:#2a4365;border-left-color:#3182ce}.doc .admonitionblock.tip a{color:#3182ce}.doc .admonitionblock.tip a:hover{color:#4299e1}.doc .admonitionblock.tip a.btn{background-color:#3182ce}.doc .admonitionblock.tip pre{background-color:#ebf8ff;color:#2b6cb0}.doc .admonitionblock.note{background-color:#edf2f7;color:#1a202c;border-left-color:#718096}.doc .admonitionblock.note a{color:#718096}.doc .admonitionblock.note a:hover{color:#a0aec0}.doc .admonitionblock.note a.btn{background-color:#718096}.doc .admonitionblock.important{background-color:#e9d8fd;color:#44337a;border-left-color:#805ad5}.doc .admonitionblock.important a{color:#805ad5}.doc .admonitionblock.important a:hover{color:#9f7aea}.doc .admonitionblock.important a.btn{background-color:#805ad5}.doc .imageblock{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.doc .imageblock img{display:block}.doc .image>img,.doc .imageblock img{height:auto;max-width:100%}#preamble .abstract blockquote{padding:.75em 1em}#preamble .abstract .title,#preamble .abstract blockquote{background:#fff;border-left:5px solid #edf2f7;color:#4a5568;font-size:.88889rem}#preamble .abstract .title{margin-bottom:0;font-weight:600;padding:.2em 1em}.doc .quoteblock blockquote{background:#f7fafc;border-left:5px solid #4a5568;color:#4a5568;padding:.25rem 2rem}.doc .quoteblock .attribution{color:#e2e8f0;font-size:.83333rem;margin-top:.75rem}.doc .quoteblock .paragraph{font-style:italic}.doc .quoteblock cite{padding-left:1em}.doc table.tableblock .paragraph{margin:0;padding:0}.doc .olist .admonitionblock,.doc .ulist .admonitionblock,.doc table.tableblock .admonitionblock{padding:0}.doc ol,.doc ul{margin:0;padding:0 0 0 2rem}.doc ol.arabic{list-style-type:decimal}.doc ol.decimal{list-style-type:decimal-leading-zero}.doc ol.loweralpha{list-style-type:lower-alpha}.doc ol.upperalpha{list-style-type:upper-alpha}.doc ol.lowerroman{list-style-type:lower-roman}.doc ol.upperroman{list-style-type:upper-roman}.doc ol.lowergreek{list-style-type:lower-greek}.doc ul.checklist{padding-left:.5rem;list-style:none}.doc ul.checklist p>i.fa-check-square-o:first-child,.doc ul.checklist p>i.fa-square-o:first-child{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:1.25rem}.doc ul.checklist i.fa-check-square-o::before{content:"\2713"}.doc ul.checklist i.fa-square-o::before{content:"\274f"}.doc .dlist .dlist,.doc .dlist .olist,.doc .dlist .ulist,.doc .olist .dlist,.doc .olist .olist,.doc .olist .ulist,.doc .ulist .dlist,.doc .ulist .olist,.doc .ulist .ulist{margin-top:.5rem}.doc .olist li,.doc .ulist li{margin-bottom:.5rem}.doc .admonitionblock .listingblock,.doc .olist .listingblock,.doc .ulist .listingblock{padding:0}.doc div.title{margin-bottom:1rem;font-weight:600}.doc .listingblock .content{position:relative}.doc .exampleblock .title,.doc .imageblock .title,.doc .listingblock .title,.doc .literalblock .title,.doc .openblock .title,.doc .tableblock caption{color:#4a5568;font-size:.88889rem;font-weight:600;font-style:italic;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;letter-spacing:.01em;padding-bottom:.075rem;text-align:left}.hide-table-captions .doc .tableblock caption{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}.doc .admonitionblock .title{font-weight:700;font-style:normal;font-size:.8rem}.doc .imageblock .title{margin-top:.5rem;padding-bottom:0}.doc .admonitionblock .title+.paragraph,.doc .exampleblock>.content>:first-child{margin-top:0}.doc .sidebarblock{background:#e2e8f0;border-radius:.75rem;padding:.75rem 0 1.5rem}.doc .sidebarblock>.content>.title{font-size:1.25rem;font-weight:600;line-height:1.3;margin-bottom:-.3em;text-align:center}.doc .sidebarblock>.content>:not(.title):first-child{margin-top:0}.doc .listingblock.hidden{display:none}.doc .listingblock.wrap pre,.doc .tableblock pre{white-space:pre-wrap}.doc pre.highlight code,.doc pre:not(.highlight){background:#f7fafc;display:block;overflow-x:auto;height:100%;padding:1.5rem .5rem;border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem}.doc .listingblock:not(.has-title) pre.highlight{border-radius:.5rem}.doc pre.highlight{position:relative;overflow-x:auto}.doc .listingblock .code-inset[data-lang]::before{content:attr(data-lang);font-size:.69444rem;font-family:Roboto Mono,monospace;letter-spacing:.05em;line-height:1;text-transform:uppercase;position:absolute;top:.5rem;right:1.5rem;margin-right:.25rem}.doc .listingblock .code-inset{display:none}.doc .listingblock:hover .code-inset{display:block}.doc .listingblock.noheader code.copied::before{display:none}.doc .dlist dt{font-style:italic}.doc .dlist dd{margin:0 0 .3rem 1.5rem}.doc .colist{font-size:.88889rem}.doc .colist>table>tbody>tr>:first-child,.doc .colist>table>tr>:first-child{padding:.25em .5rem 0;vertical-align:top}.doc .colist>table>tbody>tr>:last-child,.doc .colist>table>tr>:last-child{padding:.25rem 0}.doc .conum[data-value]{border:1px solid;border-radius:100%;display:inline-block;font-family:Nunito Sans,Helvetica Neue,helvetica,roboto,arial,sans-serif;font-size:.75rem;font-style:normal;height:1.25em;line-height:1.2;text-align:center;width:1.25em;letter-spacing:-.25ex;text-indent:-.25ex}.doc .conum[data-value]::after{content:attr(data-value)}.doc .conum[data-value]+b{display:none}.doc b.button{white-space:nowrap}.doc b.button::before{padding-right:.25em}.doc b.button::after{padding-left:.25em}.doc kbd{display:inline-block;font-size:.66667rem;line-height:1.45;background:#f7fafc;border:1px solid #cbd5e0;border-radius:.25em;-webkit-box-shadow:0 1px 0 #cbd5e0,0 0 0 .1em #fff inset;box-shadow:0 1px 0 #cbd5e0,inset 0 0 0 .1em #fff;padding:.25em .5em;white-space:nowrap;vertical-align:middle;position:relative;top:-.1em}.doc .keyseq,.doc kbd{line-height:1}.doc .keyseq{font-size:.88889rem}.doc .keyseq kbd{margin:0 .125em}.doc .keyseq kbd:first-child{margin-left:0}.doc .keyseq kbd:last-child{margin-right:0}.doc .menuseq i.caret::before{content:"\203a";font-size:1.1em;font-weight:600;line-height:.90909}.doc .icon i::after,.doc .menuseq,.doc .path,.doc a.bare,.doc b.button,.doc code,.doc kbd{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.doc td.tableblock a,.doc td.tableblock code,.doc th.tableblock{word-break:break-word}.doc table.no-break td.tableblock a,.doc table.no-break td.tableblock code,.doc table.no-break th.tableblock{word-break:normal}.doc mark{background:#fefcbf;padding:.25rem}.doc img,.doc object{max-width:100%}.doc a.button{color:#fff}.doc .button{display:inline-block;background:#718096;color:#fff;padding:.5rem 2rem;border-radius:.25rem;margin-bottom:2rem;-webkit-transition:all .2s;transition:all .2s}.doc .button:hover{background:#a0aec0;color:#fff}.doc .button::after{display:none!important}.doc .paragraph.expertise p{display:inline-block;padding:.2rem .8rem;border-radius:.25rem;background:#bee3f8;color:#2b6cb0;font-weight:600;font-size:.7rem}.doc .paragraph.expertise.Intermediate p{background:#feebc8;color:#c05621}.doc .paragraph.expertise.Advanced p{background:#c6f6d5;color:#2f855a}.doc .paragraph.release p{display:inline-block;padding:.2rem .8rem;border-radius:.25rem;background:#bee3f8;color:#2b6cb0;font-weight:600;font-size:.7rem}.doc .paragraph.release.core p{background:#feebc8;color:#c05621}.doc .paragraph.release.full p{background:#c6f6d5;color:#2f855a}.doc .paragraph.type p{display:inline-block;padding:.2rem .8rem;border-radius:.25rem;background:#bee3f8;color:#2b6cb0;font-weight:600;font-size:.7rem}.doc .paragraph.type.function p{background:#fed7d7;color:#c53030}.doc .paragraph.type.procedure p{background:#bee3f8;color:#2b6cb0}.doc .responsive-embed,.doc .videoblock{position:relative;padding-bottom:56.25%;height:0;margin-bottom:2rem}.doc .videoblock iframe,.doc .videoblock video,.responsive-embed iframe{position:absolute;top:0;left:0;width:100%;height:100%}.doc .more::after{display:inline-block;content:"→";margin-left:4px;margin-top:-4px;-webkit-transition:all .3s;transition:all .3s}.doc .more:hover::after{margin-left:12px}.doc table.tableblock{border-collapse:collapse;font-size:.83333rem;margin:2rem 0;border-radius:.25em;overflow:hidden}.doc table.tableblock.frame-all tr:last-child td,.doc table.tableblock.frame-ends tr:last-child td{border-bottom:3px solid #e2e8f0}.doc .tableblock thead{background:#f7fafc;border-bottom:#edf2f7}.doc table.tableblock,.doc table.tableblock>*>tr>*{border:0 solid #edf2f7}.doc table.grid-all>*>tr>*{border-width:1px}.doc table.grid-cols>*>tr>*{border-width:0 1px}.doc table.grid-rows>*>tr>*{border-width:1px 0}.doc table.grid-all>thead th,.doc table.grid-rows>thead th{border-bottom-width:2.5px}.doc table.frame-all{border-width:1px}.doc table.frame-ends{border-width:1px 0}.doc table.frame-sides{border-width:0 1px}.doc table.frame-none>colgroup+*>:first-child>*,.doc table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}.doc table.frame-none>:last-child>:last-child>*,.doc table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}.doc table.frame-ends>*>tr>:first-child,.doc table.frame-none>*>tr>:first-child{border-left-width:0}.doc table.frame-ends>*>tr>:last-child,.doc table.frame-none>*>tr>:last-child{border-right-width:0}.doc table.stripes-all>tbody>tr,.doc table.stripes-even>tbody>tr:nth-of-type(2n),.doc table.stripes-hover>tbody>tr:hover,.doc table.stripes-odd>tbody>tr:nth-of-type(odd){background:#f7fafc}.doc .emphasis,.doc .lead{font-weight:400}.doc .tabbed{padding:13px 0 0;margin:0 -1rem 1.5rem;background:#f7fafc;border:1px solid #e6f8ff;border-top-left-radius:6px;border-top-right-radius:6px}.doc .tabbed-tabs{margin:0 1rem;padding:0}.doc .tabbed-tabs,.doc .tabbed-tabs .tabbed-tab{display:-webkit-box;display:-ms-flexbox;display:flex}.doc .tabbed-tabs .tabbed-tab{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;list-style-type:none;font-size:.7rem;font-weight:600;padding:.4rem .6rem;margin-right:.5rem;background:#edf2f7;border-top-left-radius:6px;border-top-right-radius:6px;border:1px solid #edf2f7;border-top:3px solid #cbd5e0;border-bottom:none;cursor:pointer}.doc .tabbed-tabs .tabbed-tab--active{margin-bottom:-1px;background:#fff;color:#0056b3;border:1px solid #cbd5e0;border-top:3px solid #0056b3;border-bottom:none}.doc .tabbed-container{padding:1rem;background:#fff;border:1px solid #cbd5e0;border-top-left-radius:6px;border-top-right-radius:6px}.doc .tabbed-target{display:none;margin-bottom:0}.doc .tabbed-target--active{display:block}.page.unresolved{background:#9b2c2c;color:#fff!important}.doc .graph-app{position:relative}.doc .graph-app-logo{position:absolute;top:1rem;right:1rem}.doc a.external{position:relative}.doc a.external::after{position:relative;display:inline-block;margin:0 .2rem;content:"→";color:#805ad5;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transition:all .2s linear;transition:all .2s linear;top:0}.doc a.external:hover::after{top:-12px;opacity:0}.doc .no-arrows a::after{display:none!important}.doc .no-bullets ul{padding-left:0;list-style-type:none}.exampleblock>.content{margin-top:.75rem;padding:.5rem .75rem;border:1px solid #e2e8f0}.tabbed-container>.exampleblock>.content{border:none}.doc details{margin-bottom:1.5rem}.doc details[open] summary{font-weight:700}.doc details div.content{margin:.5rem 0 0 1.5rem}@media screen and (min-width:1024px){body.cheat-sheet .doc{-webkit-box-flex:1;-ms-flex:auto;flex:auto;font-size:.94444rem;margin:0 2rem;max-width:61.11111rem;min-width:0;padding-bottom:4rem}}body.cheat-sheet{opacity:0}body.cheat-sheet .article>.content{background:#f7fafc;padding-top:0}body.cheat-sheet .navbar,body.cheat-sheet .search .search-container .search-form{background:#fff;border-top-color:#63b3ed}body.cheat-sheet .navbar,body.cheat-sheet .navbar-brand .navbar-item:first-child,body.cheat-sheet .navbar-brand .navbar-item:first-child a{color:#718096}@media screen and (min-width:1024px){body.cheat-sheet .navbar-end .navbar-link,body.cheat-sheet .navbar-end .navbar-link:hover,body.cheat-sheet .navbar-end>.navbar-item,body.cheat-sheet .navbar-end>a.navbar-item:hover{color:#718096}body.cheat-sheet .navbar-end .navbar-link::after{border-color:#718096}body.cheat-sheet .navbar-item.has-dropdown:hover .navbar-link{color:#718096}}body.cheat-sheet .navbar-burger{color:#718096}body.cheat-sheet .navbar-burger span{background:#718096}body.cheat-sheet .doc .button{background:#3182ce;color:#fff}body.cheat-sheet .doc .button:hover{background:#4299e1;color:#fff}body.cheat-sheet .nav-item .nav-item::before,body.cheat-sheet .toc-menu li a::before{background-color:#90cdf4}body.cheat-sheet .tooltip,body.cheat-sheet .tooltip--top::after{border-bottom-color:#63b3ed}body.cheat-sheet .tooltip.tooltip--bottom::after{border-top-color:#63b3ed}body.cheat-sheet #preamble .abstract .title,body.cheat-sheet #preamble .abstract blockquote{border-left-color:#63b3ed;color:#2c5282}body.cheat-sheet .tableblock .icon i{color:#3182ce}body.cheat-sheet .navbar .navbar-item.getting-started-cta .navbar-link{background:#018bff;color:#fff}body.cheat-sheet .navbar .navbar-item.getting-started-cta .navbar-link:hover{background:#0070d9}body.cheat-sheet .navbar .navbar-item.getting-started-cta .navbar-link:active{background:#0056b3}body.cheat-sheet .navbar-brand{width:18rem}body.cheat-sheet .navbar-start{display:-webkit-box;display:-ms-flexbox;display:flex;max-width:63.11111rem;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:2rem}body.cheat-sheet .navbar-start .navbar-link{margin-left:auto}body.cheat-sheet .navbar-link a{color:#3182ce}body.cheat-sheet .navbar-link a.external::after{display:inline-block;content:"";height:1rem;width:1rem;padding:0;background:url(https://neo4j.com/docs/assets/img/navbar-external.svg) no-repeat;background-position:50%}body.cheat-sheet .selectors{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}body.cheat-sheet .selectors div[data-selector-type=labels]{display:none}body.cheat-sheet .dropdown .dropdown-label{display:inline;padding:.5rem 2rem .5rem .5rem}body.cheat-sheet .nav-panel-versions{height:auto;padding:0;display:-webkit-box;display:-ms-flexbox;display:flex}body.cheat-sheet .selectors .dropdown{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}body.cheat-sheet .nav-panel-types .dropdown .dropdown-label,body.cheat-sheet .nav-panel-versions .dropdown .dropdown-label{display:-webkit-box;display:-ms-flexbox;display:flex;white-space:nowrap}body.cheat-sheet .nav-panel-versions .dropdown .dropdown-styles{width:50%;display:inline-block}body.cheat-sheet .selectors>div{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-shadow:none;box-shadow:none;margin:.25rem}body.cheat-sheet .selectors .dropdown .dropdown-styles{display:inline-block;width:100%}body.cheat-sheet .content aside.toc.sidebar{display:none}body.cheat-sheet .nav-container{border-right:none}body.cheat-sheet aside.nav{background:#fff}body.cheat-sheet aside.nav .nav-panel-versions{top:3.77778rem}body.cheat-sheet aside.nav .selectors{position:sticky;top:3.77778rem;z-index:20;background-color:#f7fafc;padding:.5rem;gap:.5rem}body.cheat-sheet aside.nav .selectors .dropdown-label{font-weight:600}body.cheat-sheet .toc-menu-placeholder h2{display:none!important}body.cheat-sheet .toc .toc-menu ul{margin-top:.5rem}body.cheat-sheet .toc .toc-menu li{padding-left:.5rem}body.cheat-sheet .toc .toc-menu li[data-level="2"]{padding-left:2rem}body.cheat-sheet .toc .toc-menu li a{border:none;padding:.5rem 1rem;margin:.5rem 0}body.cheat-sheet .toc .toc-menu li[data-level="1"] a{font-weight:600}body.cheat-sheet .toc .toc-menu li[data-level="2"] a{padding:.25rem 1rem;margin:0}body.cheat-sheet .toc .toc-menu a.is-active{color:#2b6cb0;background-color:#e6f8ff;border-radius:.5rem}body.cheat-sheet .sect-header:first-child{display:none}body.cheat-sheet h2:not(.discrete){display:-webkit-box;display:-ms-flexbox;display:flex;font-size:2rem;font-weight:600;padding:0 .5rem;border:none;height:110px;margin:0;line-height:110px}body.cheat-sheet h3:not(.discrete){display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 60%;flex:0 0 60%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding-right:0}body.cheat-sheet h3:not(.discrete) a{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}body.cheat-sheet h3:not(.discrete) span.label{margin-left:auto}body.cheat-sheet div.deprecated h2::after,body.cheat-sheet div.deprecated h3::after{display:none}body.cheat-sheet .sect1,body.cheat-sheet .sect2{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}body.cheat-sheet .sect2{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background:#fff;padding:.5rem;margin:3.5rem 0}body.cheat-sheet .sect2:first-child{margin-top:0}body.cheat-sheet h3{-webkit-box-flex:100%;-ms-flex:100%;flex:100%;margin:0;padding:1rem .5rem}body.cheat-sheet .exampleblock{width:100%;margin-bottom:0;border-top:1px solid #e2e8f0}body.cheat-sheet .exampleblock>.content{display:-webkit-box;display:-ms-flexbox;display:flex;margin-top:0;padding:0;border:none;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:.5rem}body.cheat-sheet .example-block>.content>.listingblock{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 42%;flex:0 0 42%;margin:0;padding:1rem .5rem}body.cheat-sheet .listingblock .content{width:100%;border-radius:.5rem}body.cheat-sheet .paragraph{margin:0 0 .5rem}body.cheat-sheet .exampleblock>.content>div{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 42%;flex:0 0 42%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:1rem .5rem;margin:0}body.cheat-sheet .exampleblock>.content>div.labels{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;padding-bottom:0;padding-top:0;gap:.25rem}body.cheat-sheet .exampleblock>.content>div.labels span.label{margin-top:1rem}body.cheat-sheet div.labels span.group--products,body.cheat-sheet div.page-labels span.group--products{display:none}body.cheat-sheet .exampleblock>.content>div.extra{-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2;border-top:none}body.cheat-sheet .exampleblock>.content>div.description ul{list-style:circle;line-height:1.25;margin:0;padding:0 1rem}body.cheat-sheet .page-labels{display:-webkit-box;display:-ms-flexbox;display:flex;margin:0;padding:0;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.25rem}body.cheat-sheet .sect1>h2{padding-left:1rem}body.cheat-sheet .sect1>.page-labels{padding-right:.5rem}body.cheat-sheet .page-labels:first-of-type{margin:0 0 0 auto}body.cheat-sheet .page-labels p{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;display:-webkit-box;display:-ms-flexbox;display:flex}body.cheat-sheet .label{display:-webkit-box;display:-ms-flexbox;display:flex;line-height:1.8}body.cheat-sheet .notes{-webkit-box-flex:100%;-ms-flex:100%;flex:100%;margin:1rem .5rem}body.cheat-sheet .notes p{margin:0;padding:.5rem}body.cheat-sheet pre.highlight{white-space:pre-wrap}.toc-menu li.hidden,body.cheat-sheet .description.hidden,body.cheat-sheet .exampleblock.hidden,body.cheat-sheet .labels.hidden,body.cheat-sheet .listingblock.hidden,body.cheat-sheet .sect1.hidden,body.cheat-sheet .sect2.hidden,body.cheat-sheet span.label.hidden{display:none}@media screen and (max-width:1023px){body.cheat-sheet .toc-menu-placeholder h2{display:block;margin:0 1.5rem;padding:0}body.cheat-sheet .toc-menu-placeholder ul{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0 1rem;list-style:none}body.cheat-sheet .toc-menu-placeholder li{margin:.25rem}body.cheat-sheet .toc-menu-placeholder li[data-level="1"]{border-bottom:1px dotted #90cdf4;width:100%;margin-top:.5rem}body.cheat-sheet .toc-menu-placeholder li[data-level="2"]{border:1px solid #e2e8f0;font-size:.75556rem}body.cheat-sheet .toc-menu-placeholder li a{display:block;padding:0 .5rem}body.cheat-sheet .sect2{background:none;padding:0}body.cheat-sheet h3:not(.discrete){background:#edf2f7;margin:0 .5rem;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;border:1px solid #e2e8f0}body.cheat-sheet .sect2>div{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:.5rem;margin:0 .5rem;background-color:#edf2f7;border:1px solid #e2e8f0;border-radius:0}body.cheat-sheet .notes p{background:none}body.cheat-sheet .sect2>div.labels,body.cheat-sheet .sect2>div.page-labels{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}body.cheat-sheet .sect2>div.labels p{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}body.cheat-sheet .sect2>div.page-labels{border-left:none;margin-left:-.5rem}body.cheat-sheet .sect2>div.listingblock{margin-top:1rem;border-top:none}body.cheat-sheet .sect2>div.description{border-top:none;padding:.5rem 1rem}}@media print{body.cheat-sheet .feedback,body.cheat-sheet .navbar-burger,body.cheat-sheet .navbar-menu,body.cheat-sheet .navbar-search,body.cheat-sheet aside.toc.embedded,body.cheat-sheet footer{display:none}body.cheat-sheet .sect1{page-break-after:always}body.cheat-sheet .sect2,body.cheat-sheet .sect2>div.description,body.cheat-sheet .sect2>div.listingblock,body.cheat-sheet .sect2>div.notes{page-break-inside:avoid}}nav.pagination{border-top:1px solid #edf2f7;line-height:1;margin:2rem -1rem -1rem;padding:.75rem 1rem 2rem}nav.pagination,nav.pagination span{display:-webkit-box;display:-ms-flexbox;display:flex}nav.pagination span{-webkit-box-flex:50%;-ms-flex:50%;flex:50%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}nav.pagination .prev{padding-right:.5rem}nav.pagination .next{margin-left:auto;padding-left:.5rem;text-align:right}nav.pagination span::before{color:#a0aec0;font-size:.75em;padding-bottom:.1em}nav.pagination .prev::before{content:"Prev"}nav.pagination .next::before{content:"Next"}nav.pagination a{font-weight:600;line-height:1.3;position:relative}nav.pagination a::after,nav.pagination a::before{color:#a0aec0;font-weight:400;font-size:1.5em;line-height:.75;position:absolute;top:0;width:1rem}nav.pagination .prev a::before{content:"\2039";-webkit-transform:translateX(-100%);transform:translateX(-100%)}nav.pagination .next a::after{content:"\203a"}@media (max-width:1024px){nav.pagination{margin:2rem 0 0}}html.is-clipped--navbar{overflow-y:hidden}body{padding-top:3.77778rem}.navbar{background:#2d3748;color:#f7fafc;font-size:.88889rem;height:3.77778rem;position:fixed;top:0;width:100%;word-wrap:break-word;border-top:4px solid #edf2f7;border-bottom:1px solid #e2e8f0;z-index:5000;display:-webkit-box;display:-ms-flexbox;display:flex}.navbar a{text-decoration:none;font-weight:400}.navbar a.page-name-white{color:#fff}.navbar a.no-left-padding{padding-left:0}.navbar-brand svg{margin-right:1rem}.navbar-brand svg:last-child{margin-right:0}@media screen and (max-width:420px){.navbar-brand .navbar-item{padding-left:.5rem;padding-right:.75rem}.navbar-brand .navbar-item:last-child{padding-right:0}}.navbar-logo{height:34px;width:104px}.navbar-theme{margin-left:12px}.navbar-brand .separator{padding:0 .375rem}.navbar .navbar-brand .navbar-end{display:none}@media screen and (min-width:1024px){.navbar-end .navbar-link,.navbar-end>.navbar-item{color:#f7fafc}.navbar-end .navbar-link:hover,.navbar-end>a.navbar-item:hover{background:transparent;color:#f7fafc}.navbar-end .navbar-link::after{border-color:#f7fafc}.navbar-item.has-dropdown:hover .navbar-link{background:transparent;color:#f7fafc}.navbar .navbar-brand .navbar-end{display:-webkit-box;display:-ms-flexbox;display:flex}}.navbar-brand{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0}.navbar-burger,.navbar-search{color:#f7fafc;background:none;border:none;outline:none;line-height:1;height:3.77778rem;position:relative;width:2.75rem;padding:0}.navbar-search{margin-left:auto}.navbar-brand .navbar-search svg{margin-right:0}.navbar-burger span{background:#f7fafc;display:block;height:1px;left:50%;margin-left:-7px;position:absolute;top:50%;width:15px}.navbar-burger span:first-child{margin-top:-6px}.navbar-burger span:nth-child(2){margin-top:-1px}.navbar-burger span:nth-child(3){margin-top:4px}.navbar-burger.is-active span:first-child{margin-left:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-transform-origin:left top;transform-origin:left top}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){margin-left:-5px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:left bottom;transform-origin:left bottom}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a5568;display:block;line-height:1.8;padding:.5rem 1rem;position:relative}.navbar-item{-webkit-box-flex:0;-ms-flex:none;flex:none}.navbar-item.has-dropdown .navbar-link{padding:0 2.5em 0 0}.navbar-item .icon{width:1.1rem;height:1.1rem;display:block}@media screen and (min-width:1024px){.navbar-dropdown{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.navbar-mobile{display:none;font-weight:400}}@media screen and (max-width:1023px){.navbar-item .navbar-link{font-weight:700;padding-left:0}}.navbar-dropdown .navbar-item{padding-left:0}.navbar-dropdown a{color:#3182ce}.navbar-dropdown a:hover{color:#2c5282}@media screen and (min-width:1024px){.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}}.navbar-divider{background-color:#edf2f7;border:none;height:1px;margin:.25rem 0}@media screen and (max-width:1023px){.navbar-brand .navbar-item{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.navbar-menu{background:#fff;padding:.5rem 0}.navbar-menu.is-active{display:block;-webkit-box-shadow:0 8px 16px rgba(10,10,10,.1);box-shadow:0 8px 16px rgba(10,10,10,.1);overflow-y:auto;position:fixed;top:3.5rem;left:0;right:0;bottom:0;max-height:none;z-index:500;background:#f7fafc}.navbar-menu .navbar-link:hover,.navbar-menu a.navbar-item:hover{background-color:transparent}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.navbar-burger,.navbar-search{display:none}.navbar-item,.navbar-link{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.navbar-item.has-dropdown{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.navbar-item.docs .navbar-dropdown{width:320px}.navbar-item.labs .navbar-dropdown{min-width:280px}.navbar-item.developer .navbar-dropdown{width:310px}.navbar-item .navbar-dropdown{max-width:320px}.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.has-dropdown::after{border-width:0 0 1px 1px;border-style:solid;content:" ";display:block;height:.5em;pointer-events:none;position:absolute;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);width:.5em;margin-top:-.375em;right:1.125em;top:50%}.navbar-item.has-dropdown::before{position:absolute;content:"";display:block;top:100%;left:50%;margin-top:-.4rem;margin-left:-1.5rem;z-index:1;width:0;height:0;border-left:.4rem solid transparent;border-right:.4rem solid transparent;border-bottom:.4rem solid transparent}.developer.navbar-item.has-dropdown:hover::before{border-bottom-color:#38a169}.docs.navbar-item.has-dropdown:hover::before{border-bottom-color:#63b3ed}.navbar-item.labs.has-dropdown:hover::before{border-bottom-color:#b794f4}.navbar-menu{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.navbar-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border:1px solid #edf2f7;border-top:none;border-radius:0 0 .25rem .25rem;display:none;top:100%;right:0;min-width:100%;position:absolute}.navbar-dropdown .navbar-item{padding:.5rem 1rem;white-space:nowrap}.navbar-dropdown .navbar-item:last-child{border-radius:inherit}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown.is-right{left:auto;right:0}.navbar-dropdown a.navbar-item:hover{background-color:transparent}}.navbar .button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#dd6b20;border:1px solid #2c5282;border-radius:.15rem;height:1.75rem;color:#ebf8ff;padding:0 .75em;white-space:nowrap}.navbar-item.developer .navbar-dropdown,.navbar-item.training .navbar-dropdown{border-top-color:#38a169}.navbar-item.docs .navbar-dropdown{border-top-color:#63b3ed}.navbar-item.labs .navbar-dropdown{border-top-color:#b794f4}.navbar-item.kb .navbar-dropdown{border-top-color:#805ad5}@media screen and (min-width:1024px){.navbar-dropdown{border-top:4px solid;margin-top:0;border-radius:4px;max-width:480px}}.project{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #edf2f7}.project .project-name{color:#4a5568;font-weight:600;font-size:.88889rem}.project-description{margin:.2rem 0;font-size:.8rem;color:#718096;white-space:normal}.project-links{margin:0;padding:0;white-space:normal}.project-links li{list-style-type:none;display:inline}.project-links li::after{color:#cbd5e0;content:"|"}.project-links li:last-child::after{content:""}.project-links li:first-child{padding-left:0}.project-links li:last-child{padding-right:0;border-right:0}.project-link{font-size:.8rem;font-weight:600;display:inline-block;margin-right:.2rem}#search-open{padding-left:0}#auth{padding-left:16px}#auth .auth-user{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center;border-radius:50%;width:1.9rem;height:1.9rem;font-size:.7rem;background-size:cover;background-position:50%;border:2px solid #38a169}.getting-started-cta .project:hover{background:#eef1f6}.getting-started-cta .project-subtitle{color:#718096;font-size:13px;font-weight:400}.getting-started-cta .aura-ticker{font-size:.8rem;border:1px solid #0070d9;color:#018bff;border-radius:9999px;padding:0 8px;margin-left:4px}.getting-started-cta.navbar-item.has-dropdown::before{margin-left:0}.navbar-item.has-dropdown.getting-started-cta:hover::before{border-bottom-color:#718096}.navbar-item.has-dropdown.getting-started-cta::after{content:none}footer.footer{background-color:#2d3748;color:#a0aec0;font-size:.83333rem;line-height:1.8;padding:2rem 0}.footer .wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;max-width:40rem;margin:auto;-ms-flex-wrap:wrap;flex-wrap:wrap}.footer .column{width:50%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;min-width:180px;padding:1.5rem}@media screen and (min-width:1024px){.footer .wrapper{-webkit-box-flex:1;-ms-flex:auto;flex:auto;max-width:1280px}.footer .column{width:25%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:1.5rem}}@media screen and (max-width:1023px){.footer .column.links{padding-top:0;padding-bottom:0}.footer .column.links h2{margin-top:0}}.footer p{margin:.5rem 0}.footer a{color:#cbd5e0;font-weight:200}.footer a:hover{color:#edf2f7}footer .logo-footer{margin-bottom:25px;height:34px;background:url(https://dist.neo4j.com/wp-content/uploads/20210422201812/neo4j-logo-2020-white.svg) no-repeat}.footer h2{font-size:.83333rem;font-weight:200;color:#cbd5e0;margin:65px 0 .5rem}.footer ul{margin:.5rem 0;padding:0}.footer ul li{list-style-type:none;margin:0 0 .2rem}.footer ul li i{color:#a0aec0;font-size:1rem;width:.8rem;text-align:center;display:inline-block;margin-right:.5rem}.footer ul li.speaker-program{margin-top:2rem}footer ul li .speaker-program a{font-size:normal} +/*! Adapted from the GitHub style by Vasily Polovnyov */.hljs-comment,.hljs-quote{color:#a0aec0;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#718096;font-weight:500}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:#3182ce}.hljs-doctag,.hljs-string{color:#2f855a}.hljs-section,.hljs-selector-id,.hljs-title{color:#553c9a;font-weight:500}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#3182ce;font-weight:500}.hljs-attribute,.hljs-name,.hljs-tag{color:#805ad5;font-weight:400}.hljs-link,.hljs-regexp{color:#68d391}.hljs-bullet,.hljs-symbol{color:#434190}.hljs-built_in,.hljs-builtin-name{color:#3182ce}.hljs-meta{color:#a0aec0}.language-cypher-shell,.language-shell{color:#718096}.language-cypher-shell>.cypher,.language-shell>.bash{color:initial}.language-cypher-shell>.hljs-meta,.language-shell>.hljs-meta{color:#434190;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.language-shell .bash{color:#2d3748}.hljs-deletion{background:#edf2f7}.hljs-addition{background:#c6f6d5}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:500}@page{margin:.5in}@media print{.hide-for-print{display:none!important}html{font-size:.9375em}a{color:inherit!important;text-decoration:underline}a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none}img,object,svg,tr{page-break-inside:avoid}thead{display:table-header-group}pre{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;white-space:pre-wrap}body{padding-top:2rem}.navbar{background:none;color:inherit;position:absolute}.navbar *{color:inherit!important}#topbar-nav,.nav-container,.toolbar{display:none}.doc{color:inherit;margin:auto;max-width:none;padding-bottom:2rem}.doc .listingblock code[data-lang]::before{display:block}footer.footer{background:none;border-top:1px solid #edf2f7;color:#e2e8f0;padding:.5rem}.footer *{color:inherit}}.gram{width:100%;height:576px;background:#f7fafc;border-radius:.5rem}.gram svg{height:100%;width:100%}.label{display:inline-block;padding:.2rem .8rem;border-radius:.25rem;background:#bee3f8;color:#2b6cb0;font-weight:600;font-size:.7rem}.tableblock .label{margin-top:.2rem}.label--apoc-core,.label--core{background:#bee3f8;color:#2b6cb0}.label--apoc-full,.label--full{background:#c6f6d5;color:#2f855a}.label--procedure{background:#c3dafe;color:#4c51bf}.label--function{background:#e9d8fd;color:#6b46c1}.label--current{background:#3182ce;color:#fff}.label--beginner,.label--free{background:#0b297d;color:#fff}.label--not-on-aura{background:#c53030;color:#fff}.label--aura-db-enterprise{background:#3182ce;color:#fff}.label--aura,.label--enterprise,.label--enterprise-edition,.label--enterprise-only,.label--professional{background:#018bff;color:#fff}.label--added,.label--changed,.label--new,.label--renamed,.label--updated,.label--yes{background:#9ae6b4;color:#000}.label--na,.label--no,.label--removed{background:#fc8181;color:#000}.label--deprecated,.label--discontinued{background:#f6ad55;color:#000}.label--danger,.label--warning{background:#ffde63;color:#000}.label--default,.label--recommended{background:#a3bffa;color:#000}.label--linux,.label--mac-os,.label--unix,.label--windows{background:#4fd1c5;color:#000}.label--cypher,.label--functionality,.label--syntax{background:#e6e6e6;color:#000}.label--cluster-member-core{background:#a3bffa;color:#000}.label--cluster-member-read-replica{background:#9ae6b4;color:#000}.label--cluster-member-single{background:#faf089;color:#000}.label--admin-only{background:#2f855a;color:#fff}.glossary{display:none}.glossary-term{display:inline-block;color:#63b3ed;border-bottom:1px dotted #63b3ed}.glossary-term::after{display:inline-block;content:url(https://neo4j.com/docs/assets/img/info.svg);margin-left:6px;margin-top:-4px}code .glossary-term::after{display:none}.tooltip{font-size:.8rem;position:absolute;z-index:5000;background:#fff;border-bottom:3px solid #4a5568;border-radius:.25rem;width:220px;-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.tooltip::after{width:0;height:0;position:absolute;content:"";display:block}.tooltip.tooltip--top::after{top:0;margin-top:-.25rem;border-bottom:.5rem solid #4a5568}.tooltip.tooltip--bottom::after,.tooltip.tooltip--top::after{left:50%;margin-left:-.25rem;border-left:.5rem solid transparent;border-right:.5rem solid transparent}.tooltip.tooltip--bottom::after{bottom:0;margin-bottom:-.5rem;border-top:.5rem solid #4a5568}.tooltip .tooltip-header{background:#2d3748;border-top-left-radius:.25rem;border-top-right-radius:.25rem;color:#fff;padding:.5rem 1rem;font-weight:600}.tooltip .tooltip-body{padding:.5rem 1rem;color:#718096;font-size:.8rem}.tooltip .tooltip-body p:first-child{margin-top:0}.tooltip .tooltip-body p:last-child{margin-bottom:0}.tooltip .tooltip-body a{color:#3182ce;font-weight:600}section.hero{padding:8rem 0 0;background:#2d3748;background:#020024;background:-webkit-gradient(linear,left top,left bottom,from(#2d3748),color-stop(45%,#4a5568),to(#4a5568));background:linear-gradient(180deg,#2d3748,#4a5568 45%,#4a5568);text-align:left}body.landing .hero h1,body.landing .hero h2,body.landing .hero p,section.hero h1,section.hero h2,section.hero p{padding:0 1rem;max-width:680px;margin:auto}.landing .hero h1,.landing .hero h2,section.hero h1,section.hero h2{font-size:1.2rem;font-weight:300;display:block;color:#cbd5e0;margin-bottom:1rem}.landing .hero h1::after,.landing .hero h2::after,section.hero h1::after,section.hero h2::after{display:block;background-color:#38a169;height:3px;width:80px;margin-top:1rem;margin-bottom:2rem;content:""}.landing .hero p,section.hero p{font-size:1.8rem;color:#e2e8f0;font-weight:300}.landing .doc{max-width:none;padding:0;margin:0;width:100%;-webkit-box-flex:0!important;-ms-flex:none!important;flex:none!important}.landing .doc .sectionbody,.landing .doc h2{padding-left:1rem;padding-right:1rem;max-width:980px;margin:auto}.landing .doc .sect1{padding:2em 0;margin-top:0}.landing .doc .sect1.hero{padding-bottom:0!important}.landing .doc h1{display:none}.landing .doc .secondary{background:#f7fafc}.landing .doc .secondary.leading{margin-top:0;background:-webkit-gradient(linear,left top,left bottom,from(#e2e8f0),color-stop(35%,#f7fafc),to(#fff));background:linear-gradient(180deg,#e2e8f0,#f7fafc 35%,#fff);padding-top:4rem}.landing .doc h2{border-bottom:0}.landing .doc h2::after{display:block;background-color:#38a169;height:3px;width:80px;margin-top:1rem;margin-bottom:0;content:""}body.landing.labs h1.page{display:none}body.landing .ulist.buttons{line-height:1;margin:-1rem 0 0;text-align:center;font-size:1rem;display:block}body.landing .ulist.buttons>:first-child{padding-top:2rem}body.landing .ulist.buttons>:last-child{padding-bottom:calc(1rem + 40px)}body.landing .ulist.buttons::after,body.landing .ulist.buttons::before{content:" ";display:block;height:40px;-webkit-clip-path:polygon(100% 0,0 calc(100% + 1px),100% calc(100% + 1px));clip-path:polygon(100% 0,0 calc(100% + 1px),100% calc(100% + 1px))}body.landing .ulist.buttons::after{margin-top:-40px}body.landing .ulist.buttons p{font-size:1rem!important;display:inline;padding:0;line-height:1}body.landing .ulist.buttons ul{padding:0}body.landing .ulist.buttons li{list-style-type:none;display:block;margin:0 0 1rem}body.landing .ulist.buttons li a{display:inline-block;margin:0 .25rem;background:#2d3748;color:#fff;font-weight:600;padding:1rem 2rem;border-radius:.25rem;-webkit-transition:all .1s linear;transition:all .1s linear}@media (min-width:760px){body.landing .ulist.buttons li,body.landing .ulist.buttons li a{display:inline-block}}.landing .clearfix{clear:both}.landing .secondary::after{content:"";display:block;clear:both}@media (min-width:760px){.landing .flex-container .sectionbody{display:-webkit-box;display:-ms-flexbox;display:flex}.landing .flex-container .column{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:1rem}.landing .fleflex-containerx .column img{display:block;margin:auto;max-width:100%}.landing .flex-container .column .paragraph{margin-top:0}.landing .flex-container .column h3{margin-bottom:2em}.landing .flex-container .column h3::after{display:block;background-color:#63b3ed;height:2px;width:40px;margin-top:12px;content:""}.landing .flex-container .column:first-child{margin-left:-12px}.landing .flex-container .column:last-child{margin-right:-12px}}.landing .discrete h2,.landing .toc.sidebar{display:none}.developer.landing .use-cases .sect2 .paragraph img{width:128px}.developer.landing .use-cases .sect2 .paragraph:nth-child(3){min-height:82px}.hero{padding:8rem 0 0!important;background:#2d3748;background:#020024;background:-webkit-gradient(linear,left top,left bottom,from(#2d3748),color-stop(45%,#4a5568),to(#4a5568));background:linear-gradient(180deg,#2d3748,#4a5568 45%,#4a5568);text-align:left}.hero h1,.hero h2,.hero p,.landing .doc .hero h1,.landing .doc .hero h2,.landing .doc .hero p{padding:0 1rem;max-width:680px;margin:auto}.hero h1,.hero h2,.landing .doc .hero h1,.landing .doc .hero h2{font-size:1.2rem;font-weight:300;display:block;color:#cbd5e0;margin-bottom:1rem}.hero h1::after,.hero h2::after{display:block;background-color:#38a169;height:3px;width:80px;margin-top:1rem;margin-bottom:2rem;content:""}.hero p{font-size:1.8rem;color:#e2e8f0;font-weight:300}.hero .sectionbody,.landing .doc .hero .sectionbody{width:100%;max-width:none;padding:0}.hero .paragraph{padding-bottom:5rem;margin-bottom:0}.hero svg{width:100%;height:40px}.hero svg.bottom{margin-bottom:-1rem}.hero svg.to-white{fill:#fff;margin-bottom:-1em}.hero svg.to-leading{fill:#e2e8f0!important;margin-bottom:-1em}body.docshome{background:#f7fafc}body.docshome .nav-menu>.nav-list{margin-top:0}body.docshome .nav-menu .component-title{display:none}body.docshome .nav-item[data-depth="0"]{margin-top:.5rem}body.docshome .nav-item .nav-section-header{margin-top:0;margin-bottom:0;padding-top:1.5rem!important;border-top:1px solid var(--colors-netural-25)}body.docshome .nav-menu .nav-list:first-child .nav-item:first-child .nav-section-header{border:none;padding-top:1.5rem!important}body.docshome .nav-menu .nav-item>a{padding-top:0;padding-bottom:0;line-height:1.5}body.docshome .nav-menu .nav-item>a>strong{margin-top:1.5rem!important;margin-bottom:.5rem;font-size:1rem;display:block}body.docshome .content{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-bottom:2rem}body.docshome .doc{width:100%;max-width:1440px;padding:0}body.docshome .doc h2::after{display:block;background-color:#3182ce;height:3px;width:80px;margin-top:1rem;margin-bottom:0;content:""}body.docshome .doc div:not(.display) h2{display:none}body.docshome .nav-item:not(.is-active)>.nav-list{display:block}body.landing .toc{display:none}body.docshome .doc h2{border-bottom:0}body.docshome .sectionbody{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}body.docshome .sect1 .sectionbody>div.sect2{-webkit-box-flex:0;-ms-flex:0 1 440px;flex:0 1 440px}body.docshome .sect2{overflow:hidden;position:relative;background:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;min-width:30%;padding:1rem;margin:0 1rem 1rem 0;border-radius:.5rem;border:1px solid #d5d9de}body.docshome:not(.create-applications) .sect2{min-height:200px}body.docshome .sect2 .icon{float:left;position:absolute;top:1rem;left:1rem}body.docshome .sect2 .icon img{width:4.6rem;height:4.6rem;border-radius:50%;padding:12px}body.docshome:not(.create-applications) .sect2 .icon img{background:#e6f8ff}@media (max-width:820px){body.docshome .sect2{min-width:90%}}body.docshome .sect2 h3{font-size:1.1rem;color:#2c5282;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;line-height:1.5;margin:.5rem 2rem 0 6rem}body.docshome .sect2 h3 .anchor::before{display:none}body.docshome .sect2 .paragraph:not(.icon){text-align:left;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3;margin:.5rem 1rem 0 6rem;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}body.docshome .sect2 .paragraph.link{margin-top:.5rem;width:100%;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;font-weight:600;font-size:1rem}body.docshome .sect2 .paragraph.category{display:none}body.docshome .plain-links a.external::after{all:unset}body.docshome .sect2 .paragraph.link a:not(.external)::after{margin-left:.25rem;content:"→";font-weight:600;color:#3182ce;-webkit-transition:margin .2s linear;transition:margin .2s linear}body.docshome .sect2 .ulist{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}body.docshome .sect2 ul{margin:.2rem 0 0;padding:0;text-align:right;font-size:.8rem}body.docshome .sect2 ul li{display:inline-block;margin-bottom:0}body.docshome .sect2 ul li a{display:inline-block;color:#3182ce;border:1px solid #edf2f7;padding:.1rem .7rem;border-radius:.2rem;font-size:.7rem}@media screen and (min-width:1024px){body.docshome .toolbar{display:none}}@media screen and (max-width:1023px){body.docshome .doc{padding:1rem}body.docshome .toolbar{top:0}body.docshome .nav-container{z-index:30;margin-top:2.5rem}}.feedback{position:fixed;bottom:0;right:2rem;border-top-left-radius:.25rem;border-top-right-radius:.25rem;background:#ebf8ff;color:#2c5282;padding:.5rem 1rem;width:320px;font-size:.8rem;-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);z-index:1000}.feedback.negative{background:#fff5f5;color:#9b2c2c}.feedback.negative line{stroke:#9b2c2c}.feedback.negative a{color:#c53030}.feedback.positive{background:#f0fff4;color:#276749}.feedback .header{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.25rem 0}.feedback .header,.feedback .header p{display:-webkit-box;display:-ms-flexbox;display:flex}.feedback .header p{-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1}.feedback svg{cursor:pointer}.feedback .header svg{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.feedback .form div{font-size:.7rem}.feedback h2,.feedback p{font-size:.9rem}.feedback input{margin-right:.5rem}.feedback .feedback-option{float:left}.feedback label{font-size:.8rem}.feedback textarea{border-radius:.25rem;border:1px solid #90cdf4;background:#fff;width:100%;font-family:inherit;font-size:.7rem;color:#2b6cb0;padding:.5rem}.feedback circle,.feedback line,.feedback path{fill:transparent;stroke:#2b6cb0;stroke-width:1}.feedback .primary,.feedback .secondary{padding:.5rem 1rem;background:#ebf8ff;border:1px solid #2b6cb0;color:#2b6cb0;border-radius:.175rem;font-size:.8rem;font-family:inherit;font-weight:600;margin-right:.5rem;margin-bottom:1rem}.feedback .primary:active,.feedback .primary:focus,.feedback .secondary:active,.feedback .secondary:focus{outline:none}.feedback .primary{background:#2b6cb0;color:#fff}.feedback.negative textarea:active,.feedback.negative textarea:focus{outline:none}.feedback.negative .primary{background:#c53030;border-color:#c53030;color:#fff}.feedback.negative .secondary{background:#fff5f5;border-color:#c53030;color:#c53030}.feedback.negative textarea{background:#fff;border-color:#c53030;color:#c53030}.feedback .thank-you-negative,.feedback .thank-you-positive{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.feedback .thank-you-negative p{margin-bottom:.5rem}@media (max-width:1024px){.feedback{position:relative;border-radius:.25rem;max-width:40rem;min-width:0;right:auto;width:auto;-webkit-box-shadow:none;box-shadow:none;margin:1em 0 2rem}.feedback.absolute{top:auto!important;bottom:auto!important}}@media (min-width:1025px){.feedback.absolute{position:absolute;margin:0}}.feedback a{display:inline-block;margin-left:4px}body.docs .navbar,body.docs .search .search-container .search-form{background:#fff;border-top-color:#63b3ed}body.docs .navbar,body.docs .navbar-brand .navbar-item:first-child,body.docs .navbar-brand .navbar-item:first-child a{color:#718096}@media screen and (min-width:1024px){body.docs .navbar-end .navbar-link,body.docs .navbar-end .navbar-link:hover,body.docs .navbar-end>.navbar-item,body.docs .navbar-end>a.navbar-item:hover{color:#718096}body.docs .navbar-end .navbar-link::after{border-color:#718096}body.docs .navbar-item.has-dropdown:hover .navbar-link{color:#718096}}body.docs .navbar-burger{color:#718096}body.docs .navbar-burger span{background:#718096}body.docs .doc .button{background:#3182ce;color:#fff}body.docs .doc .button:hover{background:#4299e1;color:#fff}body.docs .nav-item .nav-item::before,body.docs .toc-menu li a::before{background-color:#90cdf4}body.docs .tooltip{border-bottom-color:#63b3ed}body.docs .tooltip--top::after{border-bottom-color:#4a5568}body.docs .tooltip.tooltip--bottom::after{border-top-color:#63b3ed}body.docs #preamble .abstract .title,body.docs #preamble .abstract blockquote{border-left-color:#63b3ed;color:#2c5282}body.docs .tableblock .icon i{color:#3182ce}body.docs .navbar .navbar-item.getting-started-cta .navbar-link{background:#018bff;color:#fff}body.docs .navbar .navbar-item.getting-started-cta .navbar-link:hover{background:#0070d9}body.docs .navbar .navbar-item.getting-started-cta .navbar-link:active{background:#0056b3}body.labs .navbar,body.labs .search .search-container .search-form{background:#fff;border-top-color:#b794f4}body.labs .navbar,body.labs .navbar-brand .navbar-item:first-child,body.labs .navbar-brand .navbar-item:first-child a{color:#718096}@media screen and (min-width:1024px){body.labs .navbar-end .navbar-link,body.labs .navbar-end .navbar-link:hover,body.labs .navbar-end>.navbar-item,body.labs .navbar-end>a.navbar-item:hover{color:#718096}body.labs .navbar-end .navbar-link::after{border-color:#718096}body.labs .navbar-item.has-dropdown:hover .navbar-link{color:#718096}}body.labs .navbar-burger{color:#718096}body.labs .navbar-burger span{background:#718096}body.labs .doc .button{background:#9f7aea;color:#fff}body.labs .doc .button:hover{background:#b794f4;color:#fff}body.labs .nav-item .nav-item::before,body.labs .toc-menu li a::before{background-color:#90cdf4}body.labs .tooltip,body.labs .tooltip--top::after{border-bottom-color:#b794f4}body.labs .tooltip.tooltip--bottom::after{border-top-color:#b794f4}body.labs #preamble .abstract .title,body.labs #preamble .abstract blockquote{border-left-color:#b794f4;color:#553c9a}body.labs .tableblock .icon i{color:#805ad5}body.labs .navbar .navbar-item.getting-started-cta .navbar-link{background:#b794f4;color:#fff}body.landing.labs .hero{background-color:#805ad5;background-image:url(https://cdn.neo4jlabs.com/images/lab-pipette-big.jpg);background-repeat:no-repeat;background-size:cover}body.landing.labs .hero h2{color:#fff}body.landing.labs h2::after{background-color:#805ad5!important}body.landing.labs .hero p{color:#fff}.landing.labs .hero .buttons::before{background-color:#805ad5}.landing.labs .hero .buttons::after{background-color:#e2e8f0}body.landing.labs .buttons>*{background:#805ad5}body.landing.labs .buttons li a{background:#553c9a;color:#fff}body.landing.labs .buttons li a:hover{background:#6b46c1}body.landing.labs .buttons li a:active{background:#3182ce}body.developer .navbar,body.developer .search .search-container .search-form{border-top-color:#38a169}body.developer .nav-item .nav-item::before,body.developer .toc-menu li a::before{background-color:#a0aec0}.developer .navbar-brand #neo4j-group{fill:#fff}.developer .navbar-brand #developer{fill:#cbd5e0}body.developer .doc .button{background:#2f855a;color:#fff}body.developer .doc .button:hover{background:#38a169;color:#fff}body.developer .doc .button:active{background:#718096;color:#fff}body.developer #preamble .abstract .title,body.developer #preamble .abstract blockquote{border-left-color:#38a169}body.developer .tableblock .icon i{color:#38a169}body.developer .navbar .navbar-item.getting-started-cta .navbar-link{background:#4a5568;color:#fff}body.landing.developer .navbar{border-bottom:0}body.landing.developer .hero{background:-webkit-gradient(linear,left top,left bottom,from(#2d3748),color-stop(45%,#4a5568),to(#4a5568));background:linear-gradient(180deg,#2d3748,#4a5568 45%,#4a5568)}@media (min-width:760px){.landing.developer .languages h3{display:none}.landing.developer .languages .flex-container{text-align:center}}.landing.developer .languages ul{padding:0;margin:0}.landing.developer .languages ul li{margin-bottom:0;list-style:none}.landing.developer .languages ul li a{font-weight:400}body.landing.developer .hero .buttons::before{background-color:#718096}body.landing.developer .hero .buttons::after{background-color:#e2e8f0}body.landing.developer .sect1 .buttons>*{background:#718096}body.landing.developer .buttons li a{background:#2d3748;color:#fff}body.landing.developer .buttons li a:hover{background:#4a5568}body.landing.developer .buttons li a:active{background:#38a169}body.kb svg.kb{margin-bottom:10px}body.kb .navbar,body.kb .search .search-container .search-form{border-top-color:#805ad5}.kb .navbar-brand #developer{fill:#cbd5e0}.kb .navbar-brand #neo4j-group{fill:#fff}body.kb .navbar .navbar-item.getting-started-cta .navbar-link{background:#805ad5;color:#fff}body.training .navbar,body.training .search .search-container .search-form{border-top-color:#d53f8c;border-bottom:0}.training .navbar-brand #developer{fill:#cbd5e0}.training .navbar-brand #neo4j-group{fill:#fff}body.graphgists .sect1.hero h2::after{background-color:#805ad5!important}body.graphgists svg.graphgists{margin-bottom:10px}body.graphgists .navbar,body.graphgists .search .search-container .search-form{border-top-color:#805ad5;border-bottom-color:#2d3748}.graphgists .navbar-brand #developer{fill:#cbd5e0}.graphgists .navbar-brand #neo4j-group{fill:#fff}body.graphgists .navbar .navbar-item.getting-started-cta .navbar-link{background:#805ad5;color:#fff}.doc pre.has-header code{border-top-left-radius:0!important;border-top-right-radius:0!important}.doc .listingblock .code-inset,.doc .listingblock .code-title{padding:.5rem}.doc .listingblock .code-title{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.doc .code-header div{padding:.25rem 0;font-weight:600}.doc .listingblock .code-spacer{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.doc .listingblock .code-language,.doc .listingblock .code-title{color:#f7fafc}.doc .listingblock .code-header{background:#4a5568;color:#f7fafc;border-top-left-radius:.5rem;border-top-right-radius:.5rem}.doc .listingblock .code-language{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;padding:.25rem 0}.doc .listingblock .code-inset .btn{padding:.6rem 0}.doc .code-footer .btn,.doc .listingblock .code-inset .btn{border:0;border-radius:.175rem;font-weight:600;line-height:1;text-align:center}.doc .code-footer .btn{background:#4a5568!important;color:#f7fafc!important;margin:.25rem 0 .25rem .5rem;padding:.6rem}.doc .code-footer .btn:focus,.doc .listingblock .code-inset .btn:focus{outline:none}.doc .listingblock .code-inset .btn-copy:hover{cursor:pointer}.doc .listingblock .code-inset .btn.btn-copy{padding:0}.doc .listingblock .code-inset .btn-copy.fa-check{background:#718096;margin:.2rem;padding:.4rem}.doc .listingblock .code-inset .btn-copy.fa-check::before{display:block;background:transparent;color:#fff!important}.doc .listingblock .code-inset{border-top-right-radius:.5rem;color:#718096;font-size:.69444rem;position:absolute;padding:.25rem .5rem;z-index:1;right:0}.doc .code-inset .copy-success.hidden{display:none}.doc .code-inset .copy-success .btn{position:absolute;right:-1rem;background:#48bb78;color:#fff!important;padding:.4rem;margin:0;line-height:1;font-size:.69444rem;width:4rem;z-index:1}.doc .code-inset .copy-success .btn::after{width:0;height:0;position:absolute;content:"";display:block;top:0;left:50%;margin-left:-.25rem;margin-top:-.25rem;border-left:.5rem solid transparent;border-right:.5rem solid transparent;border-bottom:.5rem solid #48bb78}.doc .code-footer{background:#a0aec0;color:#fff;padding:.3rem 12px .3rem 0;font-size:.8em;display:-webkit-box;display:-ms-flexbox;display:flex;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.doc .spacer{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.doc .show-more{position:absolute;bottom:0;height:2.5rem;width:100%;text-align:center;cursor:pointer}.doc .show-more a{font-weight:500;color:#f7fafc;padding:5px 10px;background:#4a5568;border-radius:30px}.doc .code-footer.has-results{border-bottom-left-radius:0;border-bottom-right-radius:0}.doc .code-footer .loading{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:0 .6rem;color:#edf2f7;font-size:.7rem}.doc .code-results{background:#edf2f7;color:#718096;border:solid #a0aec0;border-width:1px 1px 2px;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;font-size:.75rem;overflow:auto}.doc .code-results .code-result-options{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-bottom:1px solid #cbd5e0;margin:0 12px 4px}.doc .code-results .code-result-options .code-result-header{font-weight:600;text-transform:uppercase;padding:.6rem 0 .2rem}.doc .code-results button{padding:0;font-weight:600;border:0;color:#718096;background:transparent}.doc .code-results button:focus{color:#38a169;outline:none}.doc .code-results .code-result-container{width:100%;max-height:600px;overflow:auto;padding:12px}.doc .code-results .code-result-table{min-width:100%}.doc .code-results .code-result-table th{font-weight:600;text-align:left;font-size:.7rem;padding:0 .25rem 6px;color:#718096;border-bottom:1px solid #cbd5e0}.doc .code-results .code-result-table td{vertical-align:top;padding:.25rem;color:#718096}.doc .code-results .code-result-table tbody td{border-right:1px solid #e2e8f0;border-bottom:1px solid #e2e8f0}.doc .code-results .code-result-table tbody tr td:last-child{border-right-width:0}.doc .code-results .code-result-table tbody tr:hover{background:#f7fafc}.doc .code-results pre{padding:0;font-size:.6rem;background:transparent}.doc .code-results .error{border-left:4px solid #e53e3e;color:#e53e3e;padding:8px;border-radius:0}.doc .editable code,.doc .editable code:focus{outline:none}.doc .code-result-toggle{padding-right:1.2rem}.doc .code-result-toggle button{line-height:1.5;padding:.5rem 0;margin-left:.4rem;border-bottom:2px solid transparent;color:#a0aec0}.doc .code-result-toggle button.code-result-toggle--current{color:#718096;border-bottom-color:#718096}@media (min-width:760px){.code-walkthrough .doc #preamble .paragraph{font-size:1.1rem}.code-walkthrough .doc{max-width:68rem}.code-walkthrough .doc .sect1{clear:both;position:relative;padding-right:50%}.code-walkthrough .doc .sect1::after{content:"";display:block;position:absolute;top:0;bottom:-2rem;right:0;width:48%;background:#f7fafc;z-index:1}.code-walkthrough .doc .sect1.disconnected::after{display:none}.code-walkthrough .doc .sect1.first::after{top:2.7rem}.code-walkthrough .doc .sect1:first-child::after{top:2.7rem;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.code-walkthrough .doc .sect1.last::after{bottom:0;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.code-walkthrough .doc .listingblock{position:absolute;top:2.7rem;right:0;width:48%;z-index:10}.code-walkthrough .doc .listingblock code{-webkit-box-shadow:none;box-shadow:none;border:0!important}.code-walkthrough .toc{display:none}}body.kb .navbar{border-bottom:0;border-top-color:#805ad5}body.kb h1::after,body.kb h2::after{background-color:#805ad5!important}body.kb .label{background-color:#e9d8fd!important;color:#553c9a}body.kb .kb-search{max-width:680px;margin:2em auto 4rem;background:#718096;border-radius:.5rem;color:#edf2f7;padding:.5rem 1rem;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:.9rem;cursor:pointer}body.kb .kb-search,body.kb .kb-search .search-placeholder{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-direction:normal}body.kb .kb-search .search-placeholder{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:.75rem 0}body.kb .kb-search .search-shortcut{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;color:#4a5568;background:#a0aec0;padding:.5rem 1rem;border-radius:.25rem;font-size:.8rem;font-weight:400}body.kb .kb-search .kb-search-icon{padding-top:2px}body.kb .kb-search svg{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:1.6rem;height:1.6rem;stroke:#2d3748;margin-left:12px}body.kb .hero{padding-bottom:2em!important}body.kb-article .doc{max-width:none;padding:2em 0;margin:0;width:100%;-webkit-box-flex:0!important;-ms-flex:none!important;flex:none!important}body.kb-article .doc>.sect1>.sectionbody{padding-left:1rem;padding-right:1rem;max-width:980px;margin-left:auto;margin-right:auto}body.kb .doc .flex-container{padding:2em 0 1em}body.kb .doc .sectionbody{-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0}body.landing.kb.kb-home .article.paragraph{padding:0}body.landing.kb.kb-home .sectionbody{padding-left:1rem;padding-right:1rem}body.landing.kb.kb-home .flex-container .sectionbody .column{-webkit-box-flex:1;-ms-flex:1 1 25%;flex:1 1 25%;-ms-flex-wrap:wrap;flex-wrap:wrap;min-width:13rem}@media (min-width:760px){body.landing.kb.kb-home .flex-container .sectionbody .column{padding-left:0;padding-right:2rem}}body.landing.kb .doc .sectionbody .column ul li a{font-weight:200}body.landing.kb .doc .sectionbody .column ul{list-style-type:none;padding:0}.landing .flex-container .category.column:first-child{margin-left:0!important}.landing .flex-container .category.column:last-child{margin-right:0!important}body.landing.kb.kb-home ul.category-tags span.count{float:right;color:#2d3748;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:.75em;height:2em;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:1.25;padding-left:.75em;padding-right:.75em;white-space:nowrap;margin-right:2rem}body.kb .article.paragraph{padding:0 1rem}body.kb-article .doc h1{display:block}body.kb h2{font-weight:200}body.kb h2 span{color:#805ad5;font-weight:600}body.kb-article .heading{padding:2em 0}body.kb-category .breadcrumbs,body.kb-tag .breadcrumbs{padding:0 1rem}body.kb-article .breadcrumbs{padding:0}body.kb-article .breadcrumbs ul,body.kb-category .breadcrumbs ul,body.kb-tag .breadcrumbs ul{padding:0!important;margin-bottom:.2rem;font-size:.8rem}.kb-article .breadcrumbs a,.kb-category .breadcrumbs a,.kb-tag .breadcrumbs a{font-weight:200}.kb .breadcrumbs a::after{display:none}.kb-article h1.page{margin:.5rem 0}.kb .kb-metadata{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:.875rem}.kb .kb-metadata,.kb .kb-metadata-menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:0}.kb .kb-metadata-menu{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.kb .kb-metadata-menu dl{margin:0}.kb .kb-metadata dd,.kb .kb-metadata dt{display:inline-block;padding:0;margin-left:0}.kb-metadata dt::after{content:":"}.kb .kb-metadata dd{margin:0 1rem 0 .2rem}.kb .kb-metadata .edit-this-page{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.kb .kb-metadata .edit-this-page a{font-weight:400}.kb .kb-metadata .edit-this-page a::after{display:none}.training-certification .doc,.training-enrollment .doc,.training-home .doc{padding-left:1rem;padding-right:1rem;max-width:75rem;margin:auto}.training .doc h2::after{background-color:#d53f8c}.training.landing .discrete>h3{display:none}.training.landing .featured-courses{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,auto));margin:0 -1rem}.training.landing .featured-courses>.openblock{padding:1rem;margin-bottom:1rem;display:grid}.training.landing .featured-courses>.openblock>.content{-webkit-box-shadow:0 2px 10px rgba(0,0,0,.17);box-shadow:0 2px 10px rgba(0,0,0,.17);border-radius:5px;display:grid;grid-template-rows:.1fr auto 4rem;background:#fff}.training.landing .featured-courses>.openblock>.content>.imageblock{margin:0}.training.landing .featured-courses>.openblock>.content>.paragraph{padding:.5rem 1rem 0;line-height:1.4}.training.landing .course-label{background:linear-gradient(45deg,#63b3ed,#b794f4);font-size:12px;padding:2px 8px;border-radius:5px;color:#fff;font-weight:700}.training.landing .featured-courses .course-duration::before{display:inline-block;content:" ";background-image:url(https://neo4j.com/docs/assets/img/duration.svg);background-repeat:no-repeat;height:1rem;width:1rem;margin-right:.25rem}.training.landing .featured-courses .course-duration{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-top:.65rem}.training.landing a.button.course-action{background-color:#d53f8c}.training.landing a.button.course-action:hover{color:#fff;background-color:#ed64a6}.training.landing a.button.course-action:visited{color:#fff}.training-home .doc .find-training{text-align:center;padding-bottom:2em}.training-home .doc .find-training h3{margin:0;padding:0}.training-home .doc .find-training hr{background:url(https://neo4j.com/docs/assets/img/delimiter.svg) no-repeat top;background-size:contain;display:block;height:2rem;border:0;position:relative;margin-bottom:2rem}.training-home .doc .find-training hr::after,.training-home .doc .find-training hr::before{content:"";display:block;position:absolute;background:#edf2f7;height:2px;top:1.25rem}.training-home .doc .find-training hr::before{left:0;right:50%;margin-right:7.75rem}.training-home .doc .find-training hr::after{right:0;left:50%;margin-left:7.75rem}.training-home .doc section.row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-bottom:2em}.training-certification .hero,.training-enrollment .hero,.training-home .hero{color:#fff;padding:8rem 0 2rem!important;background:#2d3748;background:#020024;background:-webkit-gradient(linear,left top,left bottom,from(#2d3748),color-stop(45%,#4a5568),to(#4a5568));background:linear-gradient(180deg,#2d3748,#4a5568 45%,#4a5568);text-align:left}.training-certification .hero h1,.training-enrollment .hero h1,.training-home .hero h1{color:#fff}.training-certification .hero h1::after,.training-certification .hero h2::after,.training-enrollment .hero h1::after,.training-enrollment .hero h2::after,.training-home .hero h1::after,.training-home .hero h2::after{background-color:#d53f8c}.row>.training-courses{-webkit-box-flex:1;-ms-flex:1;flex:1;padding-right:2em;padding-top:2rem}.training-promoted{min-width:20rem}.training-courses ul{display:grid;grid-template-columns:repeat(auto-fill,minmax(350px,auto))}.training-courses ul li::after{content:"";-webkit-box-flex:1;-ms-flex:auto;flex:auto}.training-courses ul>li{padding:1rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.training-courses ul>li>a{cursor:pointer}.training-courses ul>li>a:hover{color:#fff;font-weight:800}.training-courses .course-card{-webkit-box-shadow:0 2px 10px rgba(0,0,0,.17);box-shadow:0 2px 10px rgba(0,0,0,.17);border-radius:5px;display:grid;grid-template-rows:250px 1fr;grid-template-columns:minmax(-webkit-min-content,400px);grid-template-columns:minmax(min-content,400px)}.training-courses .course-card .course-illustration{height:100%;background-repeat:no-repeat;background-size:cover;border-top-left-radius:5px;border-top-right-radius:5px}.training-courses .course-card .course-label{background:linear-gradient(45deg,#63b3ed,#b794f4);font-size:12px;padding:2px 8px;border-radius:5px;color:#fff;font-weight:700}.training-courses .course-card>.course-content{padding:.5rem 1rem 1rem;display:grid;grid-template-rows:-webkit-min-content -webkit-min-content 1fr;grid-template-rows:min-content min-content 1fr}.training-courses .course-card .course-content h3{margin:0;padding:0;font-size:1rem}.training-courses .course-content .course-duration{color:#718096;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-top:.1rem;padding:0}.training-courses .course-content .course-actions{margin-top:auto}.training-courses .course-content .course-duration::before{display:inline-block;content:" ";background-image:url(https://neo4j.com/docs/assets/img/duration.svg);height:1rem;width:1rem;margin-right:.25rem}.course-actions a.button{background-color:#d53f8c}.course-actions a.button:hover{color:#fff;background-color:#ed64a6}.course-actions a.button:visited{color:#fff}.course-actions .course-state.is-hidden{display:none}.training-courses ul>li .course-card .button{margin-top:1rem;margin-bottom:.75rem}.training-courses ul>li a{color:inherit}.training-courses ul>li a:hover{color:#d53f8c}.training-certification .doc .sect1,.training-enrollment .doc .sect1{padding:.25rem 0;margin-top:0}.training-certification .doc h2,.training-enrollment .doc h2{margin:0;border-bottom:0}.training-certification .doc h2::after,.training-enrollment .doc h2::after{display:block;height:3px;width:80px;margin-top:1rem;margin-bottom:0;content:""}.training-certification .doc,.training-enrollment .doc{padding-top:2em}.training-certification .doc section,.training-enrollment .doc section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.training-certification .doc header h3,.training-enrollment .doc header h3{margin:0;padding:.4rem 0 2rem}.training-certification .course-description,.training-enrollment .course-description{-webkit-box-flex:3;-ms-flex:3;flex:3;min-width:450px;padding-left:1rem;padding-right:1rem}.training-certification .course-actions,.training-enrollment .course-actions{display:grid;-webkit-box-flex:2;-ms-flex:2;flex:2;min-width:350px;padding-left:1rem;padding-right:1rem}.training-certification .course-actions>.content,.training-certification .course-actions>.error,.training-certification .course-actions>.spinner,.training-enrollment .course-actions>.content,.training-enrollment .course-actions>.error,.training-enrollment .course-actions>.spinner{grid-column:1/2;grid-row:1/2}.training-certification .course-actions .panel,.training-enrollment .course-actions .panel{display:grid;padding:1rem;background-color:#f7fafc;border-top:5px solid #d53f8c}.training-certification .course-actions a.button-logout,.training-enrollment .course-actions a.button-logout{background:none;color:#718096;text-decoration:underline;text-align:end;display:block;font-size:.8rem;padding:0;margin-bottom:.5rem}.training-certification .course-actions .content,.training-enrollment .course-actions .content{display:grid}.training-certification .course-actions .content>.course-state,.training-enrollment .course-actions .content>.course-state{grid-column:1/2;grid-row:1/2}.training-certification .course-actions form label,.training-enrollment .course-actions form label{color:#2d3748;display:block;font-size:1rem;margin-bottom:.5rem}.training-certification .course-actions form .field:not(:last-child),.training-enrollment .course-actions form .field:not(:last-child){margin-bottom:.75rem}.training-certification .course-actions form .field.action,.training-enrollment .course-actions form .field.action{margin-top:1rem;display:-webkit-box;display:-ms-flexbox;display:flex}.training-certification .course-actions .button-course-continue,.training-certification .course-actions .button-course-enroll,.training-certification .course-actions .button-signin,.training-enrollment .course-actions .button-course-continue,.training-enrollment .course-actions .button-course-enroll,.training-enrollment .course-actions .button-signin{margin:auto}.training-certification .course-actions form .help,.training-enrollment .course-actions form .help{font-size:.85rem;margin-top:0;font-style:italic;margin-bottom:1.25rem;margin-left:.8rem}.training-certification .course-actions form input:hover,.training-certification .course-actions form select:hover,.training-enrollment .course-actions form input:hover,.training-enrollment .course-actions form select:hover{border-color:#a0aec0}.training-certification .course-actions form select,.training-enrollment .course-actions form select{cursor:pointer;display:block;outline:0;border-radius:4px;border:1px solid #cbd5e0}.training-certification .course-actions form input[type=email],.training-certification .course-actions form input[type=text],.training-certification .course-actions form select,.training-enrollment .course-actions form input[type=email],.training-enrollment .course-actions form input[type=text],.training-enrollment .course-actions form select{max-width:100%;background-color:#fff;color:#2d3748;-webkit-appearance:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-shadow:none;box-shadow:none;font-size:1rem;height:2.5em;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;line-height:1.5;padding:calc(.5em - 1px) calc(.75em - 1px);position:relative;vertical-align:top}.training-certification .course-actions form input[type=email],.training-certification .course-actions form input[type=text],.training-enrollment .course-actions form input[type=email],.training-enrollment .course-actions form input[type=text]{width:100%;border-radius:4px;-moz-appearance:none;border:1px solid #e2e8f0;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.training-certification .course-actions form input:focus,.training-certification .course-actions form select:focus,.training-enrollment .course-actions form input:focus,.training-enrollment .course-actions form select:focus{outline:0;border-color:#d53f8c;-webkit-box-shadow:0 0 0 .125em rgba(213,63,140,.25);box-shadow:0 0 0 .125em rgba(213,63,140,.25)}.training-certification .mktoForm .mktoFieldWrap,.training-certification .mktoForm .mktoFormCol,.training-enrollment .mktoForm .mktoFieldWrap,.training-enrollment .mktoForm .mktoFormCol{width:100%}.training-certification .mktoField,.training-certification .mktoForm,.training-enrollment .mktoField,.training-enrollment .mktoForm{width:100%!important}.training-certification input.mktoField[type=checkbox],.training-enrollment input.mktoField[type=checkbox]{width:auto!important;margin-top:.5rem}.training-certification .mktoForm .mktoRequiredField .mktoAsterix,.training-enrollment .mktoForm .mktoRequiredField .mktoAsterix{display:block}.training-certification .mktoForm .mktoAsterix,.training-enrollment .mktoForm .mktoAsterix{color:#9b2c2c;display:none}.training-certification .mktoForm .mktoError .mktoErrorMsg,.training-enrollment .mktoForm .mktoError .mktoErrorMsg{display:block;margin-top:7px;border-radius:6px;background-image:none;-webkit-box-shadow:none;box-shadow:none;text-shadow:none;color:#742a2a;padding:.65rem}.training-certification .mktoForm .mktoError .mktoErrorArrow,.training-certification .mktoForm .mktoError .mktoErrorMsg,.training-enrollment .mktoForm .mktoError .mktoErrorArrow,.training-enrollment .mktoForm .mktoError .mktoErrorMsg{border:none;outline:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fed7d7}.training-certification .mktoForm button.mktoButton,.training-enrollment .mktoForm button.mktoButton{color:#fff;cursor:pointer;background-color:#d53f8c;display:inline-block;border-radius:.25rem;margin:auto;-webkit-transition:all .2s;transition:all .2s;font-weight:600}.training-certification button.mktoButton:hover,.training-enrollment button.mktoButton:hover{background-color:#ed64a6}.training-certification .mktoForm div,.training-certification .mktoForm div.mktoButtonRow,.training-certification .mktoForm label,.training-certification .mktoForm p,.training-certification .mktoForm span,.training-enrollment .mktoForm div,.training-enrollment .mktoForm div.mktoButtonRow,.training-enrollment .mktoForm label,.training-enrollment .mktoForm p,.training-enrollment .mktoForm span{display:-webkit-box;display:-ms-flexbox;display:flex}.training-certification .mktoForm span,.training-enrollment .mktoForm span{width:100%}#LblPostalCode{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;white-space:nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.training-certification .course-actions[data-status=info] .info{visibility:visible}.training-certification .course-actions[data-status=info] .content,.training-certification .course-actions[data-status=info] .error,.training-certification .course-actions[data-status=info] .spinner{visibility:hidden}.training-certification .course-actions[data-status=loading] .spinner,.training-enrollment .course-actions[data-status=loading] .spinner{visibility:visible}.training-certification .course-actions[data-status=loading] .content,.training-certification .course-actions[data-status=loading] .error,.training-certification .course-actions[data-status=loading] .info,.training-enrollment .course-actions[data-status=loading] .content,.training-enrollment .course-actions[data-status=loading] .error{visibility:hidden}.training-certification .course-actions[data-status=loaded] .content,.training-enrollment .course-actions[data-status=loaded] .content{visibility:visible}.training-certification .course-actions[data-status=loaded] .error,.training-certification .course-actions[data-status=loaded] .info,.training-certification .course-actions[data-status=loaded] .spinner,.training-enrollment .course-actions[data-status=loaded] .error,.training-enrollment .course-actions[data-status=loaded] .spinner{visibility:hidden}.training-certification .course-actions[data-status=error] .error,.training-enrollment .course-actions[data-status=error] .error{visibility:visible}.training-certification .course-actions[data-status=error] .content,.training-certification .course-actions[data-status=error] .info,.training-certification .course-actions[data-status=error] .spinner,.training-enrollment .course-actions[data-status=error] .content,.training-enrollment .course-actions[data-status=error] .spinner{visibility:hidden}.training-certification .course-actions .error,.training-enrollment .course-actions .error{background-color:#fed7d7;color:#742a2a;border-left:4px solid #e53e3e}.training-certification .course-actions .error,.training-certification .course-actions .info,.training-enrollment .course-actions .error{padding:1rem;border-radius:.25rem;display:-webkit-box;display:-ms-flexbox;display:flex;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin:0 auto auto}.training-certification .course-actions .info{background-color:#bee3f8;color:#2a4365;border-left:4px solid #3182ce}.training-certification .course-actions .spinner,.training-enrollment .course-actions .spinner{margin:0 auto auto}.training-certification .doc .sect1.heading,.training-enrollment .doc .sect1.heading{padding:2em 0 0}.training-certification .doc .sect1 h2,.training-enrollment .doc .sect1 h2{padding-bottom:1rem}.training-certification #preamble .imageblock,.training-enrollment #preamble .imageblock{max-width:40rem;margin:auto}.training-certification .breadcrumbs,.training-enrollment .breadcrumbs{display:block;padding:0}.training-certification .breadcrumbs ul,.training-enrollment .breadcrumbs ul{padding:0!important;margin-bottom:.2rem;font-size:.8rem}.training-certification .breadcrumbs a,.training-enrollment .breadcrumbs a{font-weight:200}.training-certification .breadcrumbs a::after,.training-enrollment .breadcrumbs a::after{display:none}body.training .nav-item .nav-item.is-completed::before{border-radius:9999px;content:"✓";background-color:#48bb78}body.training .nav-item .nav-item.is-completed::before,body.training .nav-item .nav-item.is-pending::before{position:absolute;left:0;top:0;margin-top:.15rem;display:block;height:1rem;width:1rem;margin-left:-1.3rem;opacity:1;z-index:1000;color:#fff;text-align:center;font-weight:700;-webkit-transition:all .2s linear;transition:all .2s linear}body.training .nav-item .nav-item.is-pending::before{border-radius:9999px;content:"";border:1px solid #a0aec0;background-color:#f7fafc}body.training .nav-item .nav-item.is-completed.is-current-page::before,body.training .nav-item .nav-item.is-completed:hover::before{background-color:#2f855a}body.training .nav-item .nav-item.is-current-page::before,body.training .nav-item .nav-item:hover::before{opacity:1;background-color:#a0aec0;z-index:1000}body.training .button{cursor:pointer}#quiz-result{padding:1rem;border-radius:.25rem}#quiz-result.is-success{background-color:#c6f6d5;color:#22543d;border-left:4px solid #38a169}#quiz-result.is-error{background-color:#fed7d7;color:#742a2a;border-left:4px solid #e53e3e}#quiz-result>p.paragraph{margin:0}.training .download-certificate{position:relative}.training .download-certificate .spinner{position:absolute;margin-top:0}.training .download-certificate .error{position:absolute;background-color:#bee3f8;color:#2a4365;border-left:4px solid #3182ce;padding:1rem;border-radius:.25rem}.training .download-certificate .success{position:absolute;background-color:#c6f6d5;color:#22543d;border-left:4px solid #38a169;padding:1rem;border-radius:.25rem}.training .download-certificate .success a{text-decoration:underline;color:#38a169}.training .download-certificate .success a:hover{color:#48bb78}.training .download-certificate[data-status=ready] .content{visibility:visible}.training .download-certificate[data-status=ready] .error,.training .download-certificate[data-status=ready] .spinner,.training .download-certificate[data-status=ready] .success{visibility:hidden}.training .download-certificate[data-status=loading] .spinner{visibility:visible}.training .download-certificate[data-status=loading] .content,.training .download-certificate[data-status=loading] .error,.training .download-certificate[data-status=loading] .success{visibility:hidden}.training .download-certificate[data-status=success] .success{visibility:visible}.training .download-certificate[data-status=success] .content,.training .download-certificate[data-status=success] .error,.training .download-certificate[data-status=success] .spinner{visibility:hidden}.training .download-certificate[data-status=error] .error{visibility:visible}.training .download-certificate[data-status=error] .content,.training .download-certificate[data-status=error] .spinner,.training .download-certificate[data-status=error] .success{visibility:hidden}.training-help{position:fixed;bottom:0;right:2rem;border-top-left-radius:.25rem;border-top-right-radius:.25rem;background:#ebf8ff;color:#2c5282;padding:.5rem 1rem;width:320px;font-size:.8rem;-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);z-index:1000}.training-help p{padding:.25rem 0}#yelp-dataset-agreement{padding:.75em;border:1px solid #e2e8f0;margin-bottom:1em;margin-right:1em}#yelp-dataset-agreement .button{margin-bottom:.25rem;margin-top:.5rem}#yelp-dataset-agreement p{padding:0;margin:0}#yelp-dataset-agreement .paragraph{padding-bottom:0;margin-bottom:0}#yelp-dataset-agreement button{display:block}#yelp-dataset-agreement label[for=yelp-dataset-agreement-check]{font-weight:600}#yelp-dataset-agreement.has-focus{background:#fff;-webkit-animation:highlight 2.5s ease;animation:highlight 2.5s ease}@-webkit-keyframes highlight{0%{background:#f0f8ff}to{background:#fff}}@keyframes highlight{0%{background:#f0f8ff}to{background:#fff}}body.graphgist .hero,body.graphgists .hero{padding-bottom:2em!important}body.graphgists .leading .sectionbody{padding-top:1rem}body.graphgists .leading .sectionbody .imageblock.left{margin-right:2rem}body.graphgists .breadcrumbs{padding:0;font-size:.9rem}body.graphgists .breadcrumbs ul{padding:0}body.graphgists ul.industries,body.graphgists ul.use-cases{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,auto));margin:0;padding:1em 0 0}body.graphgists ul.industries>li,body.graphgists ul.use-cases>li{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:1rem;padding-right:.5rem;padding-bottom:.5rem}body.graphgists ul.industries>li img,body.graphgists ul.use-cases>li img{width:1rem;max-height:1rem;margin-right:.5em}ul.graphgists{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,auto));margin:0;padding:1em 0 0;grid-gap:3em 1.5em}ul.graphgists li::after{content:"";-webkit-box-flex:1;-ms-flex:auto;flex:auto}ul.graphgists>li{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}ul.graphgists>li>a{cursor:pointer}.graphgist-card{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);border-radius:5px;display:grid;grid-template-rows:250px 1fr;grid-template-columns:minmax(-webkit-min-content,400px);grid-template-columns:minmax(min-content,400px);background-color:#fff}.graphgist-card .graphgist-illustration{height:100%;background-repeat:no-repeat;background-size:cover;border-top-left-radius:5px;border-top-right-radius:5px;background-position:50%}.graphgist-card>.graphgist-content{display:grid;grid-template-rows:-webkit-min-content -webkit-min-content 1fr;grid-template-rows:min-content min-content 1fr;border-top:1px solid #eaeaea;margin-top:.5rem;padding:1.5rem 1rem 1rem}.graphgist-card .graphgist-content h3{margin:0;padding:0;font-size:1rem;height:4rem;line-height:1.5rem}.graphgist-card dl.graphgist-info>dd{padding:0;margin:0 0 .5rem;color:#718096}.graphgist-card dl.graphgist-info>dt{color:#a0aec0;text-transform:uppercase;font-size:.8rem}.graphgist-card dl.graphgist-info>dt::after{content:": ";margin-right:.3em}.graphgist-card .graphgist-info ul.graphgist-industries,.graphgist-card .graphgist-info ul.graphgist-use-cases{margin:0;padding:0}.graphgist-card .graphgist-info ul.graphgist-industries>li,.graphgist-card .graphgist-info ul.graphgist-use-cases>li{display:inline}.graphgist-card .graphgist-info ul.graphgist-industries>li:not(:last-child)::after,.graphgist-card .graphgist-info ul.graphgist-use-cases>li:not(:last-child)::after{content:", "}ul.graphgists li:first-child{padding-left:0}ul.graphgists li:last-child{padding-right:0}body.graphgist .navbar{border-bottom:none}body.graphgist .doc{max-width:none;padding:2em 0;margin:0;width:100%;-webkit-box-flex:0;-ms-flex:none;flex:none}body.graphgist .doc>.sect1>.sectionbody{padding-left:1rem;padding-right:1rem;max-width:980px;margin-left:auto;margin-right:auto}.graphgist-metadata{background:#f7fafc;float:right;margin-left:1rem;margin-bottom:1rem;-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);padding:1rem;border-radius:.5rem;width:320px}.graphgist-metadata dl{margin-top:0}.graphgist-metadata .graphgist-industry,.graphgist-metadata .graphgist-use-case{display:block}.graphgist-metadata dt{color:#a0aec0;text-transform:uppercase;font-size:.8rem}body.graphgist .graphgist-metadata dd,body.graphgist .graphgist-metadata dt{display:block;margin-left:0;padding:0}body.graphgist .graphgist-metadata dt:not(:first-child){padding-top:1em}body.graphgist .graphgist-metadata fieldset{border:none;margin-top:1.25em;padding:.25em 0 0}body.graphgist .graphgist-metadata fieldset>legend{font-weight:600;color:#4a5568}body.graphgist .graphgist-metadata label{color:#4a5568;font-size:.9em}body.graphgist .graphgist-metadata .field.has-addons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}body.graphgist .graphgist-metadata .field.has-addons .control:first-child:not(:only-child) .input{border-bottom-right-radius:0;border-top-right-radius:0}body.graphgist .graphgist-metadata .field.has-addons .control:last-child:not(:only-child) .button{border-bottom-left-radius:0;border-top-left-radius:0}body.graphgist .graphgist-metadata .field.has-addons a.button{border-color:#805ad5;cursor:pointer;padding:calc(.5em - 1px) 1em;border-radius:.375em;-webkit-box-shadow:none;box-shadow:none;font-size:1em;line-height:1.5;height:2.5em}body.graphgist .graphgist-metadata .field.has-addons .control:not(:last-child){margin-right:-1px}body.graphgist .graphgist-metadata .input:active,body.graphgist .graphgist-metadata .input:focus{border-color:#805ad5}body.graphgist .graphgist-metadata .input:focus-visible{outline:none}body.graphgist .graphgist-metadata .input{-webkit-box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);width:100%;color:#4a5568;border-radius:.375em;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:1px solid #cbd5e0;font-size:1em;line-height:1.5;padding:calc(.5em - 1px) calc(.75em - 1px);height:2.5em}body.graphgist .graphgist-metadata .control{-webkit-box-sizing:border-box;box-sizing:border-box;clear:both;font-size:1em;position:relative;text-align:inherit}body.graphgist .listingblock pre{z-index:-1}.graphgist-metadata-menu{padding-top:1rem;border-top:1px solid #e2e8f0}.graphgist-metadata-menu ul{padding:0;list-style:none}.graphgist-metadata .button{display:block;width:100%;margin:0 0 .5rem;background:#805ad5;border:1px solid #fff;padding:.5rem 1rem;color:#fff!important;font-size:.9rem}.graphgist-metadata .button:hover{background-color:#553c9a!important}.graphgist-metadata .button.secondary{border:1px solid #805ad5!important;background:#fff!important;color:#805ad5!important}.graphgist-metadata .button.secondary:hover{background:#faf5ff!important}#search_open{display:-webkit-box;display:-ms-flexbox;display:flex;font-weight:400;padding-right:0}@media (max-width:1024px){#search_open svg{margin-right:1rem}}.search{position:fixed;top:0;right:0;bottom:0;width:100%;z-index:6000;background:rgba(0,0,0,.2);-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;display:none;opacity:0}body.search--active{overflow:hidden}.search.search--active{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1}.search .search-container{width:100%;max-width:420px;height:100%;background:#fff;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-shadow:-5px 10px 15px -3px rgba(0,0,0,.1),-5px 4px 6px -2px rgba(0,0,0,.05);box-shadow:-5px 10px 15px -3px rgba(0,0,0,.1),-5px 4px 6px -2px rgba(0,0,0,.05)}.search .search-container,.search .search-container .search-form{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-direction:normal}.search .search-container .search-form{position:relative;z-index:1000;border-top:4px solid #edf2f7;border-bottom:1px solid #e2e8f0;height:3.77778rem;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:0;-ms-flex:0;flex:0;padding-right:1rem}.search .search-container .search-form label{display:none}.search .search-container .search-form input{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:1rem;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;border:0;color:#718096;height:3rem}.search .search-container .search-form input:active,.search .search-container .search-form input:focus{outline:none}.search .search-container .search-form input::-webkit-input-placeholder{font-style:italic;color:#cbd5e0}.search .search-container .search-form input::-moz-placeholder{font-style:italic;color:#cbd5e0}.search .search-container .search-form input:-ms-input-placeholder{font-style:italic;color:#cbd5e0}.search .search-container .search-form input::-ms-input-placeholder{font-style:italic;color:#cbd5e0}.search .search-container .search-form input::placeholder{font-style:italic;color:#cbd5e0}.search .search-container .search-form .search-icon{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:1rem .5rem;display:block;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;cursor:pointer}.search svg line{stroke-width:1.5;stroke:#718096}.search .search-container .search-results{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:1rem;overflow:auto;font-size:.9rem}.search .search-container .search-results.loading{position:relative}.search .search-container .search-results.loading::before{content:"";display:block;border:.3rem solid #edf2f7;border-top-color:#718096;border-radius:50%;width:3rem;height:3rem;position:absolute;top:50%;left:50%;margin-top:-1.5rem;margin-left:-1.5rem;-webkit-animation:spinner .5s linear infinite;animation:spinner .5s linear infinite}@-webkit-keyframes spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.search .search-container .search-results p{font-size:.75rem;margin-top:0}.search .search-container .search-filters{border-top:1px solid #e2e8f0}.search .search-container .search-filters.hidden{display:none}.search .search-container .search-filters h2{color:#718096;font-weight:400;font-size:.8rem;margin:0}.search .search-filters-header{background:#ebf8ff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;cursor:pointer;padding:1rem}.search .search-filters .search-filters-content{padding:1rem;display:none}.search .search-filters--active .search-filters-content{display:block}.search .search-filters .search-filters-header .search-filters-icon{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.search .search-filters #hide_filters{display:none}.search .search-filters #show_filters,.search .search-filters--active #hide_filters{display:block}.search .search-filters--active #show_filters{display:none}.search .search-filter-checkbox{margin-bottom:.2rem;font-size:.8rem}.search .search-filter-checkbox input{margin-right:.5rem}.search .search-filter-checkbox label span{float:right;color:#a0aec0}.search-results .search-result-item{margin-bottom:2rem}.search-results .search-result-item h3{font-size:.85rem;font-weight:600;margin-bottom:0}.search-results .search-result-item h3 a{color:#3182ce}.search-results .search-result-item em{background:ivory;color:#c05621;font-style:normal;font-weight:600;padding:.2rem;border-radius:.25rem}.search-results .search-result-item .search-result-url{display:block;font-size:.7rem;font-weight:400;color:#2c5282;margin-bottom:.5rem}.search-results .search-result-item .search-result-body{font-size:.8rem;margin-bottom:.5rem;color:#718096}.search-results .search-result-label{line-height:1;font-size:.7rem;background:#edf2f7;color:#718096;font-style:normal;padding:.2rem .5rem;font-weight:600;border-radius:.25rem}.search-results .label--docs{background:#3182ce;color:#ebf8ff}.search-results .label--developer-guide{background:#2d3748;color:#edf2f7}.search-results .label--knowledge-base{background:#dd6b20;color:#fff}.search-results .search-pagination{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:.75rem;border-top:1px solid #e2e8f0;padding-top:.5rem}.search-results .search-pagination-link{color:#718096;cursor:pointer}.search-results .search-pagination-link:hover{color:#3182ce}.search-results .search-pagination .search-pagination--next{margin-left:auto}.comments{margin:1.5rem -1rem;border:1px solid #edf2f7;border-top:2px solid #edf2f7;border-radius:.5rem}.comments-header{background:#edf2f7;padding:1rem}.comments-header h2{color:#718096;font-size:.8rem;font-weight:600;line-height:1;margin:0;padding:0!important;border-bottom:0!important}.comments-container{padding:1rem}@media (max-width:720px){.comments{display:none}}#cookiebanner{background:#f7fafc;-webkit-box-shadow:0 -5px 5px 1px rgba(0,0,0,.08)!important;box-shadow:0 -5px 5px 1px rgba(0,0,0,.08)!important;padding:1rem;font-size:.8rem;color:#4a5568}#cookiebanner .row{max-width:32.5rem;margin:auto}#cookiebanner .c-header{font-size:.9rem;font-weight:600;color:#2d3748}#c-left a{color:#3182ce;font-weight:700}#c-right a{display:inline-block;padding:.25rem .75rem;font-weight:600;border:1px solid #2b6cb0;border-radius:.25rem;margin-right:.5rem}#NeoCybotCookiebotDialogBodyButtonAccept{background:#2b6cb0;color:#ebf8ff}#NeoCybotCookiebotDialogBodyButtonDecline{background:var(--white);color:#2b6cb0}.medium-zoom-overlay,img.medium-zoom-image{z-index:1000}.spinner{width:3rem;height:3rem;position:relative;margin:1rem auto}.double-bounce1,.double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#e2e8f0;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-bounce 2s ease-in-out infinite;animation:sk-bounce 2s ease-in-out infinite}.double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-bounce{0%,to{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,to{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}} +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(https://neo4j.com/docs/assets/fonts/fontawesome-webfont.eot?v=4.7.0);src:url(https://neo4j.com/docs/assets/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(https://neo4j.com/docs/assets/fonts/fontawesome-webfont.woff2?v=4.7.0) format("woff2"),url(https://neo4j.com/docs/assets/fonts/fontawesome-webfont.woff?v=4.7.0) format("woff"),url(https://neo4j.com/docs/assets/fonts/fontawesome-webfont.ttf?v=4.7.0) format("truetype"),url(https://neo4j.com/docs/assets/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal;font-display:swap}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass::before{content:"\f000"}.fa-music::before{content:"\f001"}.fa-search::before{content:"\f002"}.fa-envelope-o::before{content:"\f003"}.fa-heart::before{content:"\f004"}.fa-star::before{content:"\f005"}.fa-star-o::before{content:"\f006"}.fa-user::before{content:"\f007"}.fa-film::before{content:"\f008"}.fa-th-large::before{content:"\f009"}.fa-th::before{content:"\f00a"}.fa-th-list::before{content:"\f00b"}.fa-check::before{content:"\f00c"}.fa-close::before,.fa-remove::before,.fa-times::before{content:"\f00d"}.fa-search-plus::before{content:"\f00e"}.fa-search-minus::before{content:"\f010"}.fa-power-off::before{content:"\f011"}.fa-signal::before{content:"\f012"}.fa-cog::before,.fa-gear::before{content:"\f013"}.fa-trash-o::before{content:"\f014"}.fa-home::before{content:"\f015"}.fa-file-o::before{content:"\f016"}.fa-clock-o::before{content:"\f017"}.fa-road::before{content:"\f018"}.fa-download::before{content:"\f019"}.fa-arrow-circle-o-down::before{content:"\f01a"}.fa-arrow-circle-o-up::before{content:"\f01b"}.fa-inbox::before{content:"\f01c"}.fa-play-circle-o::before{content:"\f01d"}.fa-repeat::before,.fa-rotate-right::before{content:"\f01e"}.fa-refresh::before{content:"\f021"}.fa-list-alt::before{content:"\f022"}.fa-lock::before{content:"\f023"}.fa-flag::before{content:"\f024"}.fa-headphones::before{content:"\f025"}.fa-volume-off::before{content:"\f026"}.fa-volume-down::before{content:"\f027"}.fa-volume-up::before{content:"\f028"}.fa-qrcode::before{content:"\f029"}.fa-barcode::before{content:"\f02a"}.fa-tag::before{content:"\f02b"}.fa-tags::before{content:"\f02c"}.fa-book::before{content:"\f02d"}.fa-bookmark::before{content:"\f02e"}.fa-print::before{content:"\f02f"}.fa-camera::before{content:"\f030"}.fa-font::before{content:"\f031"}.fa-bold::before{content:"\f032"}.fa-italic::before{content:"\f033"}.fa-text-height::before{content:"\f034"}.fa-text-width::before{content:"\f035"}.fa-align-left::before{content:"\f036"}.fa-align-center::before{content:"\f037"}.fa-align-right::before{content:"\f038"}.fa-align-justify::before{content:"\f039"}.fa-list::before{content:"\f03a"}.fa-dedent::before,.fa-outdent::before{content:"\f03b"}.fa-indent::before{content:"\f03c"}.fa-video-camera::before{content:"\f03d"}.fa-image::before,.fa-photo::before,.fa-picture-o::before{content:"\f03e"}.fa-pencil::before{content:"\f040"}.fa-map-marker::before{content:"\f041"}.fa-adjust::before{content:"\f042"}.fa-tint::before{content:"\f043"}.fa-edit::before,.fa-pencil-square-o::before{content:"\f044"}.fa-share-square-o::before{content:"\f045"}.fa-check-square-o::before{content:"\f046"}.fa-arrows::before{content:"\f047"}.fa-step-backward::before{content:"\f048"}.fa-fast-backward::before{content:"\f049"}.fa-backward::before{content:"\f04a"}.fa-play::before{content:"\f04b"}.fa-pause::before{content:"\f04c"}.fa-stop::before{content:"\f04d"}.fa-forward::before{content:"\f04e"}.fa-fast-forward::before{content:"\f050"}.fa-step-forward::before{content:"\f051"}.fa-eject::before{content:"\f052"}.fa-chevron-left::before{content:"\f053"}.fa-chevron-right::before{content:"\f054"}.fa-plus-circle::before{content:"\f055"}.fa-minus-circle::before{content:"\f056"}.fa-times-circle::before{content:"\f057"}.fa-check-circle::before{content:"\f058"}.fa-question-circle::before{content:"\f059"}.fa-info-circle::before{content:"\f05a"}.fa-crosshairs::before{content:"\f05b"}.fa-times-circle-o::before{content:"\f05c"}.fa-check-circle-o::before{content:"\f05d"}.fa-ban::before{content:"\f05e"}.fa-arrow-left::before{content:"\f060"}.fa-arrow-right::before{content:"\f061"}.fa-arrow-up::before{content:"\f062"}.fa-arrow-down::before{content:"\f063"}.fa-mail-forward::before,.fa-share::before{content:"\f064"}.fa-expand::before{content:"\f065"}.fa-compress::before{content:"\f066"}.fa-plus::before{content:"\f067"}.fa-minus::before{content:"\f068"}.fa-asterisk::before{content:"\f069"}.fa-exclamation-circle::before{content:"\f06a"}.fa-gift::before{content:"\f06b"}.fa-leaf::before{content:"\f06c"}.fa-fire::before{content:"\f06d"}.fa-eye::before{content:"\f06e"}.fa-eye-slash::before{content:"\f070"}.fa-exclamation-triangle::before,.fa-warning::before{content:"\f071"}.fa-plane::before{content:"\f072"}.fa-calendar::before{content:"\f073"}.fa-random::before{content:"\f074"}.fa-comment::before{content:"\f075"}.fa-magnet::before{content:"\f076"}.fa-chevron-up::before{content:"\f077"}.fa-chevron-down::before{content:"\f078"}.fa-retweet::before{content:"\f079"}.fa-shopping-cart::before{content:"\f07a"}.fa-folder::before{content:"\f07b"}.fa-folder-open::before{content:"\f07c"}.fa-arrows-v::before{content:"\f07d"}.fa-arrows-h::before{content:"\f07e"}.fa-bar-chart-o::before,.fa-bar-chart::before{content:"\f080"}.fa-twitter-square::before{content:"\f081"}.fa-facebook-square::before{content:"\f082"}.fa-camera-retro::before{content:"\f083"}.fa-key::before{content:"\f084"}.fa-cogs::before,.fa-gears::before{content:"\f085"}.fa-comments::before{content:"\f086"}.fa-thumbs-o-up::before{content:"\f087"}.fa-thumbs-o-down::before{content:"\f088"}.fa-star-half::before{content:"\f089"}.fa-heart-o::before{content:"\f08a"}.fa-sign-out::before{content:"\f08b"}.fa-linkedin-square::before{content:"\f08c"}.fa-thumb-tack::before{content:"\f08d"}.fa-external-link::before{content:"\f08e"}.fa-sign-in::before{content:"\f090"}.fa-trophy::before{content:"\f091"}.fa-github-square::before{content:"\f092"}.fa-upload::before{content:"\f093"}.fa-lemon-o::before{content:"\f094"}.fa-phone::before{content:"\f095"}.fa-square-o::before{content:"\f096"}.fa-bookmark-o::before{content:"\f097"}.fa-phone-square::before{content:"\f098"}.fa-twitter::before{content:"\f099"}.fa-facebook-f::before,.fa-facebook::before{content:"\f09a"}.fa-github::before{content:"\f09b"}.fa-unlock::before{content:"\f09c"}.fa-credit-card::before{content:"\f09d"}.fa-feed::before,.fa-rss::before{content:"\f09e"}.fa-hdd-o::before{content:"\f0a0"}.fa-bullhorn::before{content:"\f0a1"}.fa-bell::before{content:"\f0f3"}.fa-certificate::before{content:"\f0a3"}.fa-hand-o-right::before{content:"\f0a4"}.fa-hand-o-left::before{content:"\f0a5"}.fa-hand-o-up::before{content:"\f0a6"}.fa-hand-o-down::before{content:"\f0a7"}.fa-arrow-circle-left::before{content:"\f0a8"}.fa-arrow-circle-right::before{content:"\f0a9"}.fa-arrow-circle-up::before{content:"\f0aa"}.fa-arrow-circle-down::before{content:"\f0ab"}.fa-globe::before{content:"\f0ac"}.fa-wrench::before{content:"\f0ad"}.fa-tasks::before{content:"\f0ae"}.fa-filter::before{content:"\f0b0"}.fa-briefcase::before{content:"\f0b1"}.fa-arrows-alt::before{content:"\f0b2"}.fa-group::before,.fa-users::before{content:"\f0c0"}.fa-chain::before,.fa-link::before{content:"\f0c1"}.fa-cloud::before{content:"\f0c2"}.fa-flask::before{content:"\f0c3"}.fa-cut::before,.fa-scissors::before{content:"\f0c4"}.fa-copy::before,.fa-files-o::before{content:"\f0c5"}.fa-paperclip::before{content:"\f0c6"}.fa-floppy-o::before,.fa-save::before{content:"\f0c7"}.fa-square::before{content:"\f0c8"}.fa-bars::before,.fa-navicon::before,.fa-reorder::before{content:"\f0c9"}.fa-list-ul::before{content:"\f0ca"}.fa-list-ol::before{content:"\f0cb"}.fa-strikethrough::before{content:"\f0cc"}.fa-underline::before{content:"\f0cd"}.fa-table::before{content:"\f0ce"}.fa-magic::before{content:"\f0d0"}.fa-truck::before{content:"\f0d1"}.fa-pinterest::before{content:"\f0d2"}.fa-pinterest-square::before{content:"\f0d3"}.fa-google-plus-square::before{content:"\f0d4"}.fa-google-plus::before{content:"\f0d5"}.fa-money::before{content:"\f0d6"}.fa-caret-down::before{content:"\f0d7"}.fa-caret-up::before{content:"\f0d8"}.fa-caret-left::before{content:"\f0d9"}.fa-caret-right::before{content:"\f0da"}.fa-columns::before{content:"\f0db"}.fa-sort::before,.fa-unsorted::before{content:"\f0dc"}.fa-sort-desc::before,.fa-sort-down::before{content:"\f0dd"}.fa-sort-asc::before,.fa-sort-up::before{content:"\f0de"}.fa-envelope::before{content:"\f0e0"}.fa-linkedin::before{content:"\f0e1"}.fa-rotate-left::before,.fa-undo::before{content:"\f0e2"}.fa-gavel::before,.fa-legal::before{content:"\f0e3"}.fa-dashboard::before,.fa-tachometer::before{content:"\f0e4"}.fa-comment-o::before{content:"\f0e5"}.fa-comments-o::before{content:"\f0e6"}.fa-bolt::before,.fa-flash::before{content:"\f0e7"}.fa-sitemap::before{content:"\f0e8"}.fa-umbrella::before{content:"\f0e9"}.fa-clipboard::before,.fa-paste::before{content:"\f0ea"}.fa-lightbulb-o::before{content:"\f0eb"}.fa-exchange::before{content:"\f0ec"}.fa-cloud-download::before{content:"\f0ed"}.fa-cloud-upload::before{content:"\f0ee"}.fa-user-md::before{content:"\f0f0"}.fa-stethoscope::before{content:"\f0f1"}.fa-suitcase::before{content:"\f0f2"}.fa-bell-o::before{content:"\f0a2"}.fa-coffee::before{content:"\f0f4"}.fa-cutlery::before{content:"\f0f5"}.fa-file-text-o::before{content:"\f0f6"}.fa-building-o::before{content:"\f0f7"}.fa-hospital-o::before{content:"\f0f8"}.fa-ambulance::before{content:"\f0f9"}.fa-medkit::before{content:"\f0fa"}.fa-fighter-jet::before{content:"\f0fb"}.fa-beer::before{content:"\f0fc"}.fa-h-square::before{content:"\f0fd"}.fa-plus-square::before{content:"\f0fe"}.fa-angle-double-left::before{content:"\f100"}.fa-angle-double-right::before{content:"\f101"}.fa-angle-double-up::before{content:"\f102"}.fa-angle-double-down::before{content:"\f103"}.fa-angle-left::before{content:"\f104"}.fa-angle-right::before{content:"\f105"}.fa-angle-up::before{content:"\f106"}.fa-angle-down::before{content:"\f107"}.fa-desktop::before{content:"\f108"}.fa-laptop::before{content:"\f109"}.fa-tablet::before{content:"\f10a"}.fa-mobile-phone::before,.fa-mobile::before{content:"\f10b"}.fa-circle-o::before{content:"\f10c"}.fa-quote-left::before{content:"\f10d"}.fa-quote-right::before{content:"\f10e"}.fa-spinner::before{content:"\f110"}.fa-circle::before{content:"\f111"}.fa-mail-reply::before,.fa-reply::before{content:"\f112"}.fa-github-alt::before{content:"\f113"}.fa-folder-o::before{content:"\f114"}.fa-folder-open-o::before{content:"\f115"}.fa-smile-o::before{content:"\f118"}.fa-frown-o::before{content:"\f119"}.fa-meh-o::before{content:"\f11a"}.fa-gamepad::before{content:"\f11b"}.fa-keyboard-o::before{content:"\f11c"}.fa-flag-o::before{content:"\f11d"}.fa-flag-checkered::before{content:"\f11e"}.fa-terminal::before{content:"\f120"}.fa-code::before{content:"\f121"}.fa-mail-reply-all::before,.fa-reply-all::before{content:"\f122"}.fa-star-half-empty::before,.fa-star-half-full::before,.fa-star-half-o::before{content:"\f123"}.fa-location-arrow::before{content:"\f124"}.fa-crop::before{content:"\f125"}.fa-code-fork::before{content:"\f126"}.fa-chain-broken::before,.fa-unlink::before{content:"\f127"}.fa-question::before{content:"\f128"}.fa-info::before{content:"\f129"}.fa-exclamation::before{content:"\f12a"}.fa-superscript::before{content:"\f12b"}.fa-subscript::before{content:"\f12c"}.fa-eraser::before{content:"\f12d"}.fa-puzzle-piece::before{content:"\f12e"}.fa-microphone::before{content:"\f130"}.fa-microphone-slash::before{content:"\f131"}.fa-shield::before{content:"\f132"}.fa-calendar-o::before{content:"\f133"}.fa-fire-extinguisher::before{content:"\f134"}.fa-rocket::before{content:"\f135"}.fa-maxcdn::before{content:"\f136"}.fa-chevron-circle-left::before{content:"\f137"}.fa-chevron-circle-right::before{content:"\f138"}.fa-chevron-circle-up::before{content:"\f139"}.fa-chevron-circle-down::before{content:"\f13a"}.fa-html5::before{content:"\f13b"}.fa-css3::before{content:"\f13c"}.fa-anchor::before{content:"\f13d"}.fa-unlock-alt::before{content:"\f13e"}.fa-bullseye::before{content:"\f140"}.fa-ellipsis-h::before{content:"\f141"}.fa-ellipsis-v::before{content:"\f142"}.fa-rss-square::before{content:"\f143"}.fa-play-circle::before{content:"\f144"}.fa-ticket::before{content:"\f145"}.fa-minus-square::before{content:"\f146"}.fa-minus-square-o::before{content:"\f147"}.fa-level-up::before{content:"\f148"}.fa-level-down::before{content:"\f149"}.fa-check-square::before{content:"\f14a"}.fa-pencil-square::before{content:"\f14b"}.fa-external-link-square::before{content:"\f14c"}.fa-share-square::before{content:"\f14d"}.fa-compass::before{content:"\f14e"}.fa-caret-square-o-down::before,.fa-toggle-down::before{content:"\f150"}.fa-caret-square-o-up::before,.fa-toggle-up::before{content:"\f151"}.fa-caret-square-o-right::before,.fa-toggle-right::before{content:"\f152"}.fa-eur::before,.fa-euro::before{content:"\f153"}.fa-gbp::before{content:"\f154"}.fa-dollar::before,.fa-usd::before{content:"\f155"}.fa-inr::before,.fa-rupee::before{content:"\f156"}.fa-cny::before,.fa-jpy::before,.fa-rmb::before,.fa-yen::before{content:"\f157"}.fa-rouble::before,.fa-rub::before,.fa-ruble::before{content:"\f158"}.fa-krw::before,.fa-won::before{content:"\f159"}.fa-bitcoin::before,.fa-btc::before{content:"\f15a"}.fa-file::before{content:"\f15b"}.fa-file-text::before{content:"\f15c"}.fa-sort-alpha-asc::before{content:"\f15d"}.fa-sort-alpha-desc::before{content:"\f15e"}.fa-sort-amount-asc::before{content:"\f160"}.fa-sort-amount-desc::before{content:"\f161"}.fa-sort-numeric-asc::before{content:"\f162"}.fa-sort-numeric-desc::before{content:"\f163"}.fa-thumbs-up::before{content:"\f164"}.fa-thumbs-down::before{content:"\f165"}.fa-youtube-square::before{content:"\f166"}.fa-youtube::before{content:"\f167"}.fa-xing::before{content:"\f168"}.fa-xing-square::before{content:"\f169"}.fa-youtube-play::before{content:"\f16a"}.fa-dropbox::before{content:"\f16b"}.fa-stack-overflow::before{content:"\f16c"}.fa-instagram::before{content:"\f16d"}.fa-flickr::before{content:"\f16e"}.fa-adn::before{content:"\f170"}.fa-bitbucket::before{content:"\f171"}.fa-bitbucket-square::before{content:"\f172"}.fa-tumblr::before{content:"\f173"}.fa-tumblr-square::before{content:"\f174"}.fa-long-arrow-down::before{content:"\f175"}.fa-long-arrow-up::before{content:"\f176"}.fa-long-arrow-left::before{content:"\f177"}.fa-long-arrow-right::before{content:"\f178"}.fa-apple::before{content:"\f179"}.fa-windows::before{content:"\f17a"}.fa-android::before{content:"\f17b"}.fa-linux::before{content:"\f17c"}.fa-dribbble::before{content:"\f17d"}.fa-skype::before{content:"\f17e"}.fa-foursquare::before{content:"\f180"}.fa-trello::before{content:"\f181"}.fa-female::before{content:"\f182"}.fa-male::before{content:"\f183"}.fa-gittip::before,.fa-gratipay::before{content:"\f184"}.fa-sun-o::before{content:"\f185"}.fa-moon-o::before{content:"\f186"}.fa-archive::before{content:"\f187"}.fa-bug::before{content:"\f188"}.fa-vk::before{content:"\f189"}.fa-weibo::before{content:"\f18a"}.fa-renren::before{content:"\f18b"}.fa-pagelines::before{content:"\f18c"}.fa-stack-exchange::before{content:"\f18d"}.fa-arrow-circle-o-right::before{content:"\f18e"}.fa-arrow-circle-o-left::before{content:"\f190"}.fa-caret-square-o-left::before,.fa-toggle-left::before{content:"\f191"}.fa-dot-circle-o::before{content:"\f192"}.fa-wheelchair::before{content:"\f193"}.fa-vimeo-square::before{content:"\f194"}.fa-try::before,.fa-turkish-lira::before{content:"\f195"}.fa-plus-square-o::before{content:"\f196"}.fa-space-shuttle::before{content:"\f197"}.fa-slack::before{content:"\f198"}.fa-envelope-square::before{content:"\f199"}.fa-wordpress::before{content:"\f19a"}.fa-openid::before{content:"\f19b"}.fa-bank::before,.fa-institution::before,.fa-university::before{content:"\f19c"}.fa-graduation-cap::before,.fa-mortar-board::before{content:"\f19d"}.fa-yahoo::before{content:"\f19e"}.fa-google::before{content:"\f1a0"}.fa-reddit::before{content:"\f1a1"}.fa-reddit-square::before{content:"\f1a2"}.fa-stumbleupon-circle::before{content:"\f1a3"}.fa-stumbleupon::before{content:"\f1a4"}.fa-delicious::before{content:"\f1a5"}.fa-digg::before{content:"\f1a6"}.fa-pied-piper-pp::before{content:"\f1a7"}.fa-pied-piper-alt::before{content:"\f1a8"}.fa-drupal::before{content:"\f1a9"}.fa-joomla::before{content:"\f1aa"}.fa-language::before{content:"\f1ab"}.fa-fax::before{content:"\f1ac"}.fa-building::before{content:"\f1ad"}.fa-child::before{content:"\f1ae"}.fa-paw::before{content:"\f1b0"}.fa-spoon::before{content:"\f1b1"}.fa-cube::before{content:"\f1b2"}.fa-cubes::before{content:"\f1b3"}.fa-behance::before{content:"\f1b4"}.fa-behance-square::before{content:"\f1b5"}.fa-steam::before{content:"\f1b6"}.fa-steam-square::before{content:"\f1b7"}.fa-recycle::before{content:"\f1b8"}.fa-automobile::before,.fa-car::before{content:"\f1b9"}.fa-cab::before,.fa-taxi::before{content:"\f1ba"}.fa-tree::before{content:"\f1bb"}.fa-spotify::before{content:"\f1bc"}.fa-deviantart::before{content:"\f1bd"}.fa-soundcloud::before{content:"\f1be"}.fa-database::before{content:"\f1c0"}.fa-file-pdf-o::before{content:"\f1c1"}.fa-file-word-o::before{content:"\f1c2"}.fa-file-excel-o::before{content:"\f1c3"}.fa-file-powerpoint-o::before{content:"\f1c4"}.fa-file-image-o::before,.fa-file-photo-o::before,.fa-file-picture-o::before{content:"\f1c5"}.fa-file-archive-o::before,.fa-file-zip-o::before{content:"\f1c6"}.fa-file-audio-o::before,.fa-file-sound-o::before{content:"\f1c7"}.fa-file-movie-o::before,.fa-file-video-o::before{content:"\f1c8"}.fa-file-code-o::before{content:"\f1c9"}.fa-vine::before{content:"\f1ca"}.fa-codepen::before{content:"\f1cb"}.fa-jsfiddle::before{content:"\f1cc"}.fa-life-bouy::before,.fa-life-buoy::before,.fa-life-ring::before,.fa-life-saver::before,.fa-support::before{content:"\f1cd"}.fa-circle-o-notch::before{content:"\f1ce"}.fa-ra::before,.fa-rebel::before,.fa-resistance::before{content:"\f1d0"}.fa-empire::before,.fa-ge::before{content:"\f1d1"}.fa-git-square::before{content:"\f1d2"}.fa-git::before{content:"\f1d3"}.fa-hacker-news::before,.fa-y-combinator-square::before,.fa-yc-square::before{content:"\f1d4"}.fa-tencent-weibo::before{content:"\f1d5"}.fa-qq::before{content:"\f1d6"}.fa-wechat::before,.fa-weixin::before{content:"\f1d7"}.fa-paper-plane::before,.fa-send::before{content:"\f1d8"}.fa-paper-plane-o::before,.fa-send-o::before{content:"\f1d9"}.fa-history::before{content:"\f1da"}.fa-circle-thin::before{content:"\f1db"}.fa-header::before{content:"\f1dc"}.fa-paragraph::before{content:"\f1dd"}.fa-sliders::before{content:"\f1de"}.fa-share-alt::before{content:"\f1e0"}.fa-share-alt-square::before{content:"\f1e1"}.fa-bomb::before{content:"\f1e2"}.fa-futbol-o::before,.fa-soccer-ball-o::before{content:"\f1e3"}.fa-tty::before{content:"\f1e4"}.fa-binoculars::before{content:"\f1e5"}.fa-plug::before{content:"\f1e6"}.fa-slideshare::before{content:"\f1e7"}.fa-twitch::before{content:"\f1e8"}.fa-yelp::before{content:"\f1e9"}.fa-newspaper-o::before{content:"\f1ea"}.fa-wifi::before{content:"\f1eb"}.fa-calculator::before{content:"\f1ec"}.fa-paypal::before{content:"\f1ed"}.fa-google-wallet::before{content:"\f1ee"}.fa-cc-visa::before{content:"\f1f0"}.fa-cc-mastercard::before{content:"\f1f1"}.fa-cc-discover::before{content:"\f1f2"}.fa-cc-amex::before{content:"\f1f3"}.fa-cc-paypal::before{content:"\f1f4"}.fa-cc-stripe::before{content:"\f1f5"}.fa-bell-slash::before{content:"\f1f6"}.fa-bell-slash-o::before{content:"\f1f7"}.fa-trash::before{content:"\f1f8"}.fa-copyright::before{content:"\f1f9"}.fa-at::before{content:"\f1fa"}.fa-eyedropper::before{content:"\f1fb"}.fa-paint-brush::before{content:"\f1fc"}.fa-birthday-cake::before{content:"\f1fd"}.fa-area-chart::before{content:"\f1fe"}.fa-pie-chart::before{content:"\f200"}.fa-line-chart::before{content:"\f201"}.fa-lastfm::before{content:"\f202"}.fa-lastfm-square::before{content:"\f203"}.fa-toggle-off::before{content:"\f204"}.fa-toggle-on::before{content:"\f205"}.fa-bicycle::before{content:"\f206"}.fa-bus::before{content:"\f207"}.fa-ioxhost::before{content:"\f208"}.fa-angellist::before{content:"\f209"}.fa-cc::before{content:"\f20a"}.fa-ils::before,.fa-shekel::before,.fa-sheqel::before{content:"\f20b"}.fa-meanpath::before{content:"\f20c"}.fa-buysellads::before{content:"\f20d"}.fa-connectdevelop::before{content:"\f20e"}.fa-dashcube::before{content:"\f210"}.fa-forumbee::before{content:"\f211"}.fa-leanpub::before{content:"\f212"}.fa-sellsy::before{content:"\f213"}.fa-shirtsinbulk::before{content:"\f214"}.fa-simplybuilt::before{content:"\f215"}.fa-skyatlas::before{content:"\f216"}.fa-cart-plus::before{content:"\f217"}.fa-cart-arrow-down::before{content:"\f218"}.fa-diamond::before{content:"\f219"}.fa-ship::before{content:"\f21a"}.fa-user-secret::before{content:"\f21b"}.fa-motorcycle::before{content:"\f21c"}.fa-street-view::before{content:"\f21d"}.fa-heartbeat::before{content:"\f21e"}.fa-venus::before{content:"\f221"}.fa-mars::before{content:"\f222"}.fa-mercury::before{content:"\f223"}.fa-intersex::before,.fa-transgender::before{content:"\f224"}.fa-transgender-alt::before{content:"\f225"}.fa-venus-double::before{content:"\f226"}.fa-mars-double::before{content:"\f227"}.fa-venus-mars::before{content:"\f228"}.fa-mars-stroke::before{content:"\f229"}.fa-mars-stroke-v::before{content:"\f22a"}.fa-mars-stroke-h::before{content:"\f22b"}.fa-neuter::before{content:"\f22c"}.fa-genderless::before{content:"\f22d"}.fa-facebook-official::before{content:"\f230"}.fa-pinterest-p::before{content:"\f231"}.fa-whatsapp::before{content:"\f232"}.fa-server::before{content:"\f233"}.fa-user-plus::before{content:"\f234"}.fa-user-times::before{content:"\f235"}.fa-bed::before,.fa-hotel::before{content:"\f236"}.fa-viacoin::before{content:"\f237"}.fa-train::before{content:"\f238"}.fa-subway::before{content:"\f239"}.fa-medium::before{content:"\f23a"}.fa-y-combinator::before,.fa-yc::before{content:"\f23b"}.fa-optin-monster::before{content:"\f23c"}.fa-opencart::before{content:"\f23d"}.fa-expeditedssl::before{content:"\f23e"}.fa-battery-4::before,.fa-battery-full::before,.fa-battery::before{content:"\f240"}.fa-battery-3::before,.fa-battery-three-quarters::before{content:"\f241"}.fa-battery-2::before,.fa-battery-half::before{content:"\f242"}.fa-battery-1::before,.fa-battery-quarter::before{content:"\f243"}.fa-battery-0::before,.fa-battery-empty::before{content:"\f244"}.fa-mouse-pointer::before{content:"\f245"}.fa-i-cursor::before{content:"\f246"}.fa-object-group::before{content:"\f247"}.fa-object-ungroup::before{content:"\f248"}.fa-sticky-note::before{content:"\f249"}.fa-sticky-note-o::before{content:"\f24a"}.fa-cc-jcb::before{content:"\f24b"}.fa-cc-diners-club::before{content:"\f24c"}.fa-clone::before{content:"\f24d"}.fa-balance-scale::before{content:"\f24e"}.fa-hourglass-o::before{content:"\f250"}.fa-hourglass-1::before,.fa-hourglass-start::before{content:"\f251"}.fa-hourglass-2::before,.fa-hourglass-half::before{content:"\f252"}.fa-hourglass-3::before,.fa-hourglass-end::before{content:"\f253"}.fa-hourglass::before{content:"\f254"}.fa-hand-grab-o::before,.fa-hand-rock-o::before{content:"\f255"}.fa-hand-paper-o::before,.fa-hand-stop-o::before{content:"\f256"}.fa-hand-scissors-o::before{content:"\f257"}.fa-hand-lizard-o::before{content:"\f258"}.fa-hand-spock-o::before{content:"\f259"}.fa-hand-pointer-o::before{content:"\f25a"}.fa-hand-peace-o::before{content:"\f25b"}.fa-trademark::before{content:"\f25c"}.fa-registered::before{content:"\f25d"}.fa-creative-commons::before{content:"\f25e"}.fa-gg::before{content:"\f260"}.fa-gg-circle::before{content:"\f261"}.fa-tripadvisor::before{content:"\f262"}.fa-odnoklassniki::before{content:"\f263"}.fa-odnoklassniki-square::before{content:"\f264"}.fa-get-pocket::before{content:"\f265"}.fa-wikipedia-w::before{content:"\f266"}.fa-safari::before{content:"\f267"}.fa-chrome::before{content:"\f268"}.fa-firefox::before{content:"\f269"}.fa-opera::before{content:"\f26a"}.fa-internet-explorer::before{content:"\f26b"}.fa-television::before,.fa-tv::before{content:"\f26c"}.fa-contao::before{content:"\f26d"}.fa-500px::before{content:"\f26e"}.fa-amazon::before{content:"\f270"}.fa-calendar-plus-o::before{content:"\f271"}.fa-calendar-minus-o::before{content:"\f272"}.fa-calendar-times-o::before{content:"\f273"}.fa-calendar-check-o::before{content:"\f274"}.fa-industry::before{content:"\f275"}.fa-map-pin::before{content:"\f276"}.fa-map-signs::before{content:"\f277"}.fa-map-o::before{content:"\f278"}.fa-map::before{content:"\f279"}.fa-commenting::before{content:"\f27a"}.fa-commenting-o::before{content:"\f27b"}.fa-houzz::before{content:"\f27c"}.fa-vimeo::before{content:"\f27d"}.fa-black-tie::before{content:"\f27e"}.fa-fonticons::before{content:"\f280"}.fa-reddit-alien::before{content:"\f281"}.fa-edge::before{content:"\f282"}.fa-credit-card-alt::before{content:"\f283"}.fa-codiepie::before{content:"\f284"}.fa-modx::before{content:"\f285"}.fa-fort-awesome::before{content:"\f286"}.fa-usb::before{content:"\f287"}.fa-product-hunt::before{content:"\f288"}.fa-mixcloud::before{content:"\f289"}.fa-scribd::before{content:"\f28a"}.fa-pause-circle::before{content:"\f28b"}.fa-pause-circle-o::before{content:"\f28c"}.fa-stop-circle::before{content:"\f28d"}.fa-stop-circle-o::before{content:"\f28e"}.fa-shopping-bag::before{content:"\f290"}.fa-shopping-basket::before{content:"\f291"}.fa-hashtag::before{content:"\f292"}.fa-bluetooth::before{content:"\f293"}.fa-bluetooth-b::before{content:"\f294"}.fa-percent::before{content:"\f295"}.fa-gitlab::before{content:"\f296"}.fa-wpbeginner::before{content:"\f297"}.fa-wpforms::before{content:"\f298"}.fa-envira::before{content:"\f299"}.fa-universal-access::before{content:"\f29a"}.fa-wheelchair-alt::before{content:"\f29b"}.fa-question-circle-o::before{content:"\f29c"}.fa-blind::before{content:"\f29d"}.fa-audio-description::before{content:"\f29e"}.fa-volume-control-phone::before{content:"\f2a0"}.fa-braille::before{content:"\f2a1"}.fa-assistive-listening-systems::before{content:"\f2a2"}.fa-american-sign-language-interpreting::before,.fa-asl-interpreting::before{content:"\f2a3"}.fa-deaf::before,.fa-deafness::before,.fa-hard-of-hearing::before{content:"\f2a4"}.fa-glide::before{content:"\f2a5"}.fa-glide-g::before{content:"\f2a6"}.fa-sign-language::before,.fa-signing::before{content:"\f2a7"}.fa-low-vision::before{content:"\f2a8"}.fa-viadeo::before{content:"\f2a9"}.fa-viadeo-square::before{content:"\f2aa"}.fa-snapchat::before{content:"\f2ab"}.fa-snapchat-ghost::before{content:"\f2ac"}.fa-snapchat-square::before{content:"\f2ad"}.fa-pied-piper::before{content:"\f2ae"}.fa-first-order::before{content:"\f2b0"}.fa-yoast::before{content:"\f2b1"}.fa-themeisle::before{content:"\f2b2"}.fa-google-plus-circle::before,.fa-google-plus-official::before{content:"\f2b3"}.fa-fa::before,.fa-font-awesome::before{content:"\f2b4"}.fa-handshake-o::before{content:"\f2b5"}.fa-envelope-open::before{content:"\f2b6"}.fa-envelope-open-o::before{content:"\f2b7"}.fa-linode::before{content:"\f2b8"}.fa-address-book::before{content:"\f2b9"}.fa-address-book-o::before{content:"\f2ba"}.fa-address-card::before,.fa-vcard::before{content:"\f2bb"}.fa-address-card-o::before,.fa-vcard-o::before{content:"\f2bc"}.fa-user-circle::before{content:"\f2bd"}.fa-user-circle-o::before{content:"\f2be"}.fa-user-o::before{content:"\f2c0"}.fa-id-badge::before{content:"\f2c1"}.fa-drivers-license::before,.fa-id-card::before{content:"\f2c2"}.fa-drivers-license-o::before,.fa-id-card-o::before{content:"\f2c3"}.fa-quora::before{content:"\f2c4"}.fa-free-code-camp::before{content:"\f2c5"}.fa-telegram::before{content:"\f2c6"}.fa-thermometer-4::before,.fa-thermometer-full::before,.fa-thermometer::before{content:"\f2c7"}.fa-thermometer-3::before,.fa-thermometer-three-quarters::before{content:"\f2c8"}.fa-thermometer-2::before,.fa-thermometer-half::before{content:"\f2c9"}.fa-thermometer-1::before,.fa-thermometer-quarter::before{content:"\f2ca"}.fa-thermometer-0::before,.fa-thermometer-empty::before{content:"\f2cb"}.fa-shower::before{content:"\f2cc"}.fa-bath::before,.fa-bathtub::before,.fa-s15::before{content:"\f2cd"}.fa-podcast::before{content:"\f2ce"}.fa-window-maximize::before{content:"\f2d0"}.fa-window-minimize::before{content:"\f2d1"}.fa-window-restore::before{content:"\f2d2"}.fa-times-rectangle::before,.fa-window-close::before{content:"\f2d3"}.fa-times-rectangle-o::before,.fa-window-close-o::before{content:"\f2d4"}.fa-bandcamp::before{content:"\f2d5"}.fa-grav::before{content:"\f2d6"}.fa-etsy::before{content:"\f2d7"}.fa-imdb::before{content:"\f2d8"}.fa-ravelry::before{content:"\f2d9"}.fa-eercast::before{content:"\f2da"}.fa-microchip::before{content:"\f2db"}.fa-snowflake-o::before{content:"\f2dc"}.fa-superpowers::before{content:"\f2dd"}.fa-wpexplorer::before{content:"\f2de"}.fa-meetup::before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.doc .paragraph .title{font-weight:600}.doc .listingblock.dot{height:400px;overflow:scroll;border:2px solid #805ad5}.docs.image-border article img,.docs article .border img{border:1px solid #63b3ed;border-radius:4px;padding:1rem}.docs.image-shadow article img,.docs article .shadow img{-webkit-box-shadow:2px 2px 4px 0 #a0aec0,0 4px 4px 2px #e2e8f0,0 4px 6px 4px #edf2f7,4px 4px 4px 4px #f7fafc;box-shadow:2px 2px 4px 0 #a0aec0,0 4px 4px 2px #e2e8f0,0 4px 6px 4px #edf2f7,4px 4px 4px 4px #f7fafc}.docs article .no-border img{border:none;padding:0}.docs article .no-shadow img{-webkit-box-shadow:none;box-shadow:none}section.deprecated .title::after{bottom:4px;margin-left:10px}div.roles,div.roles>span.role{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;gap:8px;font-size:2rem;line-height:1.3}@media screen and (max-width:1023px){div.roles,div.roles>span.role::after{margin-left:0}div.roles,div.roles>span.role{margin-bottom:0}}.deprecated>.title::after,.sect1.alpha h2::after,.sect1.beta h2::after,.sect2.alpha h3::after,.sect2.beta h3::after,body.deprecated article dt::after,body.deprecated article h2::after,body.deprecated article h3::after,body.deprecated article h4::after,body.fabric article h2::after,body.fabric article h3::after,body.fabric article h4::after,div.aura-db-enterprise h2::after,div.aura-db-enterprise h3::after,div.aura-db-enterprise h4::after,div.deprecated h2::after,div.deprecated h3::after,div.deprecated h4::after,div.enterprise-edition h2::after,div.enterprise-edition h3::after,div.enterprise-edition h4::after,div.fabric h2::after,div.fabric h3::after,div.fabric h4::after,div.not-on-aura h2::after,div.not-on-aura h3::after,div.not-on-aura h4::after,p.aura-db-enterprise::before,p.deprecated::before,p.enterprise-edition::before,p.fabric::before,p.not-on-aura::before,section.aura-db-enterprise.title::after,section.deprecated .title::after,section.enterprise-edition .title::after,section.fabric .title::after,section.not-on-aura .title::after,span.alpha::after,span.aura-db-enterprise::after,span.beta::after,span.deprecated::after,span.enterprise-edition::after,span.fabric::after,span.not-on-aura::after{text-align:center;font-family:Roboto,-apple-system,BlinkMacSystemFont,Segoe UI,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;font-size:1rem;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;padding:5px 8px;border-style:solid;border-width:1px;border-radius:6px;bottom:2px;margin-left:8px}.sect1.show-roles h2::after,.sect2.show-roles h3::after,.sect3.show-roles h4::after{display:none}.sect1.show-roles h2,.sect2.show-roles h3,.sect2.show-roles h4{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.sect2.show-roles div.roles,.sect2.show-roles div.roles>span.role{font-size:1rem;margin-bottom:0}.sect-header{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline;margin-bottom:1rem}.sect1:not(.display)>.sect-header{border-bottom:1px solid #e2e8f0;margin-bottom:1rem;padding-bottom:.5rem}.sect1 div.roles>span.role,div.roles>span.role::after{margin:0}.doc .sect-header h2{border-bottom:none;margin-bottom:0}.deprecated>.title::after,.deprecated dt::after,body.deprecated article h2::after,body.deprecated article h3::after,body.deprecated article h4::after,div.deprecated h2::after,div.deprecated h3::after,div.deprecated h4::after,p.deprecated::before,section.deprecated .title::after,span.deprecated::after{content:"deprecated";color:#d53f8c;border-color:#d53f8c;margin-left:8px}div.not-on-aura h2::after,div.not-on-aura h3::after,div.not-on-aura h4::after,p.not-on-aura::before,section.not-on-aura .title::after,span.not-on-aura::after{content:"Not available on Aura";color:#c53030;border-color:#c53030}div.aura-db-enterprise h2::after,div.aura-db-enterprise h3::after,div.aura-db-enterprise h4::after,p.aura-db-enterprise::before,section.aura-db-enterprise.title::after,span.aura-db-enterprise::after{content:"AuraDB Enterprise";color:#3182ce;border-color:#3182ce}div.enterprise-edition h2::after,div.enterprise-edition h3::after,div.enterprise-edition h4::after,p.enterprise-edition::before,section.enterprise-edition .title::after,span.enterprise-edition::after{content:"Enterprise Edition";color:#38a169;border-color:#38a169}div.fabric h2::after,div.fabric h3::after,div.fabric h4::after,p.fabric::before,section.fabric .title::after,span.fabric::after{content:"Fabric";color:#4299e1;border-color:#4299e1}.admonitionblock td.icon .icon-::before{content:"\f088";color:#f58220}.doc .admonitionblock.deprecated .icon{background-color:#d53f8c;color:#fff}.doc .admonitionblock.deprecated .icon i::after{content:"DEPRECATED"}.doc .admonitionblock.deprecated{background-color:#fed7e2;color:#702459;border-left-color:#d53f8c}.doc .admonitionblock.deprecated pre{background-color:#fff5f5;color:#c53030}.doc .admonitionblock.deprecated a{color:#e53e3e}.doc pre{font-size:.77778rem}.doc .paragraph.erroronlyqueryresult,.doc .paragraph.statsonlyqueryresult{font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:.77778rem;background-color:#edf2f7;margin:-1.5rem 30% 1.5rem 2rem;padding-top:.25rem;padding-bottom:.25rem;padding-left:1.5rem}.sect1.alpha h2::after,.sect1.beta h2::after,.sect2.alpha h3::after,.sect2.beta h3::after,span.alpha::after,span.beta::after{color:#ed8936}.sect1.alpha h2::after,.sect2.alpha h3::after,span.alpha::after{content:"alpha"}.sect1.beta h2::after,.sect2.beta h3::after,span.beta::after{content:"beta"}div.tier-note p{padding:10px}div.tier-note p::before{border-right:thin solid #cbd5e0;padding:0 10px;margin-right:10px;font-family:fantasy;font-size:2rem;color:#ed8936;text-shadow:1px 1px 2px rgba(0,0,0,.5)}div.alpha-symbol p::before{content:"\03b1"}div.beta-symbol p::before{content:"\03b2"}.function-reference::after{content:"\2A0D";margin-left:.5em;padding:0 .5em;background-color:#e9d8fd;color:#6b46c1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;border-radius:25%}.graph-variants>.title{color:#4a5568!important;font-style:normal!important;font-size:1.11111rem!important}.graph-variants>.content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}@media screen and (max-width:1244px){.graph-variants>.content>.paragraph{-webkit-box-flex:0;-ms-flex:0 0 30%;flex:0 0 30%}}@media screen and (max-width:582px){.graph-variants>.content>.paragraph{-webkit-box-flex:1;-ms-flex:1 1 20%;flex:1 1 20%}}@media screen and (min-width:1245px){.graph-variants>.content>.paragraph{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}}.graph-variants>.content>.paragraph{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;white-space:nowrap;padding:.2rem .3rem;margin:.5em 1em 0 0;line-height:1em;border-radius:.2rem}.graph-variants>.content>.supported::before{content:"\2714";margin-right:.5em;color:#00ba88}.graph-variants>.content>.supported{background-color:#e1faef}.graph-variants>.content>.allowed::before{content:"(\2714)";margin-right:.5em;color:#808a87}.graph-variants>.content>.allowed{background-color:#e4e9e8}.graph-variants>.content>.not-supported{background-color:#ffe6e9}.graph-variants>.content>.not-supported::before{content:"\2716";margin-right:.5em;color:#ed1252}.newsletter{background:#bee3f8;border-radius:.5rem;color:#2b6cb0;font-size:.77778rem;padding:1rem}.newsletter h2{font-size:.88889rem;font-weight:600;line-height:1.5;margin:0;color:#2c5282}.newsletter p{margin:.25rem 0}.newsletter label{color:#2b6cb0}.newsletter .mktoForm .mktoRequiredField .mktoAsterix,.newsletter .mktoGutter,.newsletter .mktoOffset{display:none!important}.newsletter .mktoForm input{outline:none;margin:0!important;border:1px solid #90cdf4!important;border-radius:.25rem!important;background:#ebf8ff!important;color:#2c5282!important}.newsletter .mktoLogicalField{padding:0!important}.newsletter .mktoLogicalField label{width:100%!important}.newsletter .mktoForm div.mktoButtonRow{width:100%}.newsletter .mktoForm .mktoButtonWrap.mktoSimple .mktoButton{background:#2c5282!important;color:#ebf8ff!important;width:100%!important;border-radius:.25rem!important;border:0}.toc .newsletter{position:absolute;bottom:6rem}.arrange-options ul{margin:1rem 0!important;padding:0!important;min-height:1.5rem}.arrange-options .arrange-message{font-size:.75rem;color:#718096;border-bottom:1px solid #e2e8f0;margin:0 0 .25rem;padding-bottom:.25rem}.arrange-options li,.arrange pre code span{display:inline-block;background:#f7fafc;border:1px solid #edf2f7;border-radius:.25rem;padding:.25rem .5rem;margin:0 .5rem 0 0;font-family:Roboto Mono,monospace;cursor:pointer}.arrange pre code span{background:#fff} diff --git a/docs/source/themes/neo4j/static/fonts/nunito-sans-cyrillic-ext.woff2 b/docs/source/themes/neo4j/static/fonts/nunito-sans-cyrillic-ext.woff2 new file mode 100644 index 00000000..381d41fb Binary files /dev/null and b/docs/source/themes/neo4j/static/fonts/nunito-sans-cyrillic-ext.woff2 differ diff --git a/docs/source/themes/neo4j/static/fonts/nunito-sans-cyrillic.woff2 b/docs/source/themes/neo4j/static/fonts/nunito-sans-cyrillic.woff2 new file mode 100644 index 00000000..a45f4778 Binary files /dev/null and b/docs/source/themes/neo4j/static/fonts/nunito-sans-cyrillic.woff2 differ diff --git a/docs/source/themes/neo4j/static/fonts/nunito-sans-latin-ext.woff2 b/docs/source/themes/neo4j/static/fonts/nunito-sans-latin-ext.woff2 new file mode 100644 index 00000000..ff275508 Binary files /dev/null and b/docs/source/themes/neo4j/static/fonts/nunito-sans-latin-ext.woff2 differ diff --git a/docs/source/themes/neo4j/static/fonts/nunito-sans-latin.woff2 b/docs/source/themes/neo4j/static/fonts/nunito-sans-latin.woff2 new file mode 100644 index 00000000..b0e2c35f Binary files /dev/null and b/docs/source/themes/neo4j/static/fonts/nunito-sans-latin.woff2 differ diff --git a/docs/source/themes/neo4j/static/fonts/nunito-sans-vietnamese.woff2 b/docs/source/themes/neo4j/static/fonts/nunito-sans-vietnamese.woff2 new file mode 100644 index 00000000..8f9ec7cc Binary files /dev/null and b/docs/source/themes/neo4j/static/fonts/nunito-sans-vietnamese.woff2 differ diff --git a/docs/source/themes/neo4j/static/img/.keep b/docs/source/themes/neo4j/static/img/.keep new file mode 100644 index 00000000..e69de29b diff --git a/docs/source/themes/neo4j/static/js/12-fragment-jumper.js b/docs/source/themes/neo4j/static/js/12-fragment-jumper.js new file mode 100644 index 00000000..b2021ca8 --- /dev/null +++ b/docs/source/themes/neo4j/static/js/12-fragment-jumper.js @@ -0,0 +1,53 @@ +;(function () { + 'use strict' + + var article = document.querySelector('article.doc') + var cheatSheet = document.querySelector('body.cheat-sheet') + var toolbar = document.querySelector('.toolbar') + var headerNavigationBar = document.querySelector('header > .navbar') + + function decodeFragment (hash) { + return hash && (~hash.indexOf('%') ? decodeURIComponent(hash) : hash).slice(1) + } + + function computePosition (el, sum) { + if (article.contains(el)) { + return computePosition(el.offsetParent, el.offsetTop + sum) + } else { + return sum + } + } + + function jumpToAnchor (e) { + if (e) { + window.location.hash = '#' + this.id + e.preventDefault() + } + var topOffset = toolbar ? toolbar.getBoundingClientRect().bottom : headerNavigationBar.getBoundingClientRect().bottom + + if (cheatSheet) { + var scrollTarget = this.closest('div') + var selectorsTop = document.querySelector('.nav-container .selectors').querySelector('div').getBoundingClientRect().top + if (this.tagName === 'H3') topOffset = selectorsTop + window.scrollTo(0, computePosition(scrollTarget, 0) - topOffset) + } else { + window.scrollTo(0, computePosition(this, 0) - topOffset) + } + } + + window.addEventListener('load', function jumpOnLoad (e) { + var fragment, target + if ((fragment = decodeFragment(window.location.hash)) && (target = document.getElementById(fragment))) { + jumpToAnchor.bind(target)() + setTimeout(jumpToAnchor.bind(target), 0) + } + window.removeEventListener('load', jumpOnLoad) + }) + + Array.prototype.slice.call(document.querySelectorAll('a[href^="#"]')).forEach(function (el) { + var fragment, target + if ((fragment = decodeFragment(el.hash)) && (target = document.getElementById(fragment))) { + el.addEventListener('click', jumpToAnchor.bind(target)) + } + }) +})() diff --git a/docs/source/themes/neo4j/static/menu.svg b/docs/source/themes/neo4j/static/menu.svg new file mode 100644 index 00000000..1cc79e63 --- /dev/null +++ b/docs/source/themes/neo4j/static/menu.svg @@ -0,0 +1 @@ + diff --git a/docs/source/themes/neo4j/theme.conf b/docs/source/themes/neo4j/theme.conf new file mode 100644 index 00000000..ea34e31b --- /dev/null +++ b/docs/source/themes/neo4j/theme.conf @@ -0,0 +1,9 @@ +[theme] +inherit = basic +stylesheet = css/neo4j.css +pygments_style = sphinx +sidebars = navigation.html, searchbox.html, indexnav.html + +[options] +sidebar_includehidden = false +sidebar_collapse = false diff --git a/docs/source/types.rst b/docs/source/types.rst new file mode 100644 index 00000000..9444c987 --- /dev/null +++ b/docs/source/types.rst @@ -0,0 +1,17 @@ +.. _types-documentation: + +***** +Types +***** + +Embedder +======== + +.. autoclass:: neo4j_genai.embedder.Embedder + :members: + + +VectorSearchRecord +================== + +.. autoclass:: neo4j_genai.types.VectorSearchRecord diff --git a/poetry.lock b/poetry.lock index 7f293a50..69e849eb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -110,6 +110,17 @@ files = [ [package.dependencies] frozenlist = ">=1.1.0" +[[package]] +name = "alabaster" +version = "0.7.16" +description = "A light, configurable Sphinx theme" +optional = false +python-versions = ">=3.9" +files = [ + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -204,6 +215,20 @@ files = [ [package.dependencies] cryptography = "*" +[[package]] +name = "babel" +version = "2.15.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, + {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + [[package]] name = "certifi" version = "2024.2.2" @@ -570,6 +595,17 @@ files = [ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] +[[package]] +name = "docutils" +version = "0.21.2" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=3.9" +files = [ + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, +] + [[package]] name = "exceptiongroup" version = "1.2.1" @@ -986,13 +1022,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.23.0" +version = "0.23.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.23.0-py3-none-any.whl", hash = "sha256:075c30d48ee7db2bba779190dc526d2c11d422aed6f9044c5e2fdc2c432fdb91"}, - {file = "huggingface_hub-0.23.0.tar.gz", hash = "sha256:7126dedd10a4c6fac796ced4d87a8cf004efc722a5125c2c09299017fa366fa9"}, + {file = "huggingface_hub-0.23.1-py3-none-any.whl", hash = "sha256:720a5bffd2b1b449deb793da8b0df7a9390a7e238534d5a08c9fbcdecb1dd3cb"}, + {file = "huggingface_hub-0.23.1.tar.gz", hash = "sha256:4f62dbf6ae94f400c6d3419485e52bce510591432a5248a65d0cb72e4d479eb4"}, ] [package.dependencies] @@ -1043,6 +1079,36 @@ files = [ {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "7.1.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -1203,13 +1269,13 @@ extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15. [[package]] name = "langchain-core" -version = "0.2.0" +version = "0.2.1" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.0-py3-none-any.whl", hash = "sha256:973cf3402d428018dc68313d8be0e721cea5b18d4ae82149ad659dbce34dc296"}, - {file = "langchain_core-0.2.0.tar.gz", hash = "sha256:22c84e88aa7e98a0b98fadb3238343152641afce6ff27e8f2d9f5ff421e35a35"}, + {file = "langchain_core-0.2.1-py3-none-any.whl", hash = "sha256:3521e1e573988c47399fca9739270c5d34f8ecec147253ad829eb9ff288f76d5"}, + {file = "langchain_core-0.2.1.tar.gz", hash = "sha256:49383126168d934559a543ce812c485048d9e6ac9b6798fbf3d4a72b6bba5b0c"}, ] [package.dependencies] @@ -1772,13 +1838,13 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.4.127" +version = "12.5.40" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d9714f27c1d0f0895cd8915c07a87a1d0029a0aa36acaf9156952ec2a8a12189"}, + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-win_amd64.whl", hash = "sha256:c3401dc8543b52d3a8158007a0c1ab4e9c768fcbd24153a48c86972102197ddd"}, ] [[package]] @@ -2157,6 +2223,20 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pylint" version = "3.2.2" @@ -2387,13 +2467,13 @@ files = [ [[package]] name = "requests" -version = "2.32.1" +version = "2.32.2" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" files = [ - {file = "requests-2.32.1-py3-none-any.whl", hash = "sha256:21ac9465cdf8c1650fe1ecde8a71669a93d4e6f147550483a2967d08396a56a5"}, - {file = "requests-2.32.1.tar.gz", hash = "sha256:eb97e87e64c79e64e5b8ac75cee9dd1f97f49e289b083ee6be96268930725685"}, + {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, + {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, ] [package.dependencies] @@ -2665,19 +2745,18 @@ dev = ["pre-commit", "pytest", "ruff (>=0.3.0)"] [[package]] name = "setuptools" -version = "69.5.1" +version = "70.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, - {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, + {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, + {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "sniffio" @@ -2690,6 +2769,147 @@ files = [ {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "sphinx" +version = "7.3.7" +description = "Python documentation generator" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"}, + {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"}, +] + +[package.dependencies] +alabaster = ">=0.7.14,<0.8.0" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.22" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.14" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.9" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "importlib_metadata", "mypy (==1.9.0)", "pytest (>=6.0)", "ruff (==0.3.7)", "sphinx-lint", "tomli", "types-docutils", "types-requests"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=6.0)", "setuptools (>=67.0)"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.8" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.6" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.5" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.7" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.10" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + [[package]] name = "sqlalchemy" version = "2.0.30" @@ -3396,10 +3616,25 @@ files = [ idna = ">=2.0" multidict = ">=4.0" +[[package]] +name = "zipp" +version = "3.18.2" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.18.2-py3-none-any.whl", hash = "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e"}, + {file = "zipp-3.18.2.tar.gz", hash = "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + [extras] external-clients = ["weaviate-client"] [metadata] lock-version = "2.0" python-versions = "^3.8.1" -content-hash = "007bd62f66d21149923ecfc8b3ca8594362c3f5ad34ccb66122c98bac58305b1" +content-hash = "8eec8a21722e0c9ac64e72b221e50d63dacce021634297b1bce9a95cbf80ab77" diff --git a/pyproject.toml b/pyproject.toml index 38838e2f..98eaa2c4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ [tool.poetry] name = "neo4j-genai" -version = "0.2.0a0" +version = "0.2.0a1" description = "Python package to allow easy integration to Neo4j's GenAI features" authors = ["Neo4j, Inc "] license = "Apache License, Version 2.0" @@ -45,10 +45,12 @@ weaviate-client = "^4.6.1" sentence-transformers = "^2.7.0" langchain-community = "^0.2.0" requests = "^2.32.0" +sphinx = { version = "^7.2.6", python = "^3.9" } [tool.poetry.extras] external_clients = ["weaviate-client"] + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/src/neo4j_genai/embedder.py b/src/neo4j_genai/embedder.py index 4cd69529..8070e17b 100644 --- a/src/neo4j_genai/embedder.py +++ b/src/neo4j_genai/embedder.py @@ -17,7 +17,10 @@ class Embedder(ABC): - """Interface for embedding models.""" + """ + Interface for embedding models. + An embedder passed into a retriever must implement this interface. + """ @abstractmethod def embed_query(self, text: str) -> list[float]: diff --git a/src/neo4j_genai/retrievers/__init__.py b/src/neo4j_genai/retrievers/__init__.py index e69de29b..edf3991d 100644 --- a/src/neo4j_genai/retrievers/__init__.py +++ b/src/neo4j_genai/retrievers/__init__.py @@ -0,0 +1,15 @@ +# Copyright (c) "Neo4j" +# Neo4j Sweden AB [https://neo4j.com] +# # +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# # +# https://www.apache.org/licenses/LICENSE-2.0 +# # +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/src/neo4j_genai/retrievers/hybrid.py b/src/neo4j_genai/retrievers/hybrid.py index f9342781..2f7108af 100644 --- a/src/neo4j_genai/retrievers/hybrid.py +++ b/src/neo4j_genai/retrievers/hybrid.py @@ -35,6 +35,33 @@ class HybridRetriever(Retriever): + """ + Provides retrieval method using combination of vector search over embeddings and + fulltext search. + If an embedder is provided, it needs to have the required Embedder type. + + Example: + + .. code-block:: python + + import neo4j + from neo4j_genai import HybridRetriever + + driver = neo4j.GraphDatabase.driver(URI, auth=AUTH) + + retriever = HybridRetriever( + driver, "vector-index-name", "fulltext-index-name", custom_embedder + ) + retriever.search(query_text="Find me a book about Fremen", top_k=5) + + Args: + driver (Driver): The Neo4j Python driver. + vector_index_name (str): Vector index name. + fulltext_index_name (str): Fulltext index name. + embedder (Optional[Embedder]): Embedder object to embed query text. + return_properties (Optional[list[str]]): List of node properties to return. + """ + def __init__( self, driver: neo4j.Driver, @@ -76,17 +103,22 @@ def search( Both query_vector and query_text can be provided. If query_vector is provided, then it will be preferred over the embedded query_text for the vector search. + See the following documentation for more details: - - [Query a vector index](https://neo4j.com/docs/cypher-manual/current/indexes-for-vector-search/#indexes-vector-query) - - [db.index.vector.queryNodes()](https://neo4j.com/docs/operations-manual/5/reference/procedures/#procedure_db_index_vector_queryNodes) - - [db.index.fulltext.queryNodes()](https://neo4j.com/docs/operations-manual/5/reference/procedures/#procedure_db_index_fulltext_querynodes) + + - `Query a vector index `_ + - `db.index.vector.queryNodes() `_ + - `db.index.fulltext.queryNodes() `_ + Args: query_text (str): The text to get the closest neighbors of. query_vector (Optional[list[float]], optional): The vector embeddings to get the closest neighbors of. Defaults to None. top_k (int, optional): The number of neighbors to return. Defaults to 5. + Raises: ValueError: If validation of the input arguments fail. ValueError: If no embedder is provided. + Returns: list[neo4j.Record]: The results of the search query """ @@ -119,6 +151,35 @@ def search( class HybridCypherRetriever(Retriever): + """ + Provides retrieval method using combination of vector search over embeddings and + fulltext search, augmented by a Cypher query. + This retriever builds on HybridRetriever. + If an embedder is provided, it needs to have the required Embedder type. + + Example: + + .. code-block:: python + + import neo4j + from neo4j_genai import HybridCypherRetriever + + driver = neo4j.GraphDatabase.driver(URI, auth=AUTH) + + retrieval_query = "MATCH (node)-[:AUTHORED_BY]->(author:Author)" "RETURN author.name" + retriever = HybridCypherRetriever( + driver, "vector-index-name", "fulltext-index-name", retrieval_query, custom_embedder + ) + retriever.search(query_text="Find me a book about Fremen", top_k=5) + + Args: + driver (Driver): The Neo4j Python driver. + vector_index_name (str): Vector index name. + fulltext_index_name (str): Fulltext index name. + retrieval_query (str): Cypher query that gets appended. + embedder (Optional[Embedder]): Embedder object to embed query text. + """ + def __init__( self, driver: neo4j.Driver, @@ -161,18 +222,23 @@ def search( Both query_vector and query_text can be provided. If query_vector is provided, then it will be preferred over the embedded query_text for the vector search. + See the following documentation for more details: - - [Query a vector index](https://neo4j.com/docs/cypher-manual/current/indexes-for-vector-search/#indexes-vector-query) - - [db.index.vector.queryNodes()](https://neo4j.com/docs/operations-manual/5/reference/procedures/#procedure_db_index_vector_queryNodes) - - [db.index.fulltext.queryNodes()](https://neo4j.com/docs/operations-manual/5/reference/procedures/#procedure_db_index_fulltext_querynodes) + + - `Query a vector index `_ + - `db.index.vector.queryNodes() `_ + - `db.index.fulltext.queryNodes() `_ + Args: query_text (str): The text to get the closest neighbors of. - query_vector (Optional[list[float]], optional): The vector embeddings to get the closest neighbors of. Defaults to None. - top_k (int, optional): The number of neighbors to return. Defaults to 5. - query_params (Optional[dict[str, Any]], optional): Parameters for the Cypher query. Defaults to None. + query_vector (Optional[list[float]]): The vector embeddings to get the closest neighbors of. Defaults to None. + top_k (int): The number of neighbors to return. Defaults to 5. + query_params (Optional[dict[str, Any]]): Parameters for the Cypher query. Defaults to None. + Raises: ValueError: If validation of the input arguments fail. ValueError: If no embedder is provided. + Returns: list[neo4j.Record]: The results of the search query """ diff --git a/src/neo4j_genai/retrievers/vector.py b/src/neo4j_genai/retrievers/vector.py index 3307af26..8770f70f 100644 --- a/src/neo4j_genai/retrievers/vector.py +++ b/src/neo4j_genai/retrievers/vector.py @@ -39,6 +39,24 @@ class VectorRetriever(Retriever): """ Provides retrieval method using vector search over embeddings. If an embedder is provided, it needs to have the required Embedder type. + + Example: + + .. code-block:: python + + import neo4j + from neo4j_genai import VectorRetriever + + driver = neo4j.GraphDatabase.driver(URI, auth=AUTH) + + retriever = VectorRetriever(driver, "vector-index-name", custom_embedder) + retriever.search(query_text="Find me a book about Fremen", top_k=5) + + Args: + driver (Driver): The Neo4j Python driver. + index_name (str): Vector index name. + embedder (Optional[Embedder]): Embedder object to embed query text. + return_properties (Optional[list[str]]): List of node properties to return. """ def __init__( @@ -83,13 +101,14 @@ def search( """Get the top_k nearest neighbor embeddings for either provided query_vector or query_text. See the following documentation for more details: - - [Query a vector index](https://neo4j.com/docs/cypher-manual/current/indexes-for-vector-search/#indexes-vector-query) - - [db.index.vector.queryNodes()](https://neo4j.com/docs/operations-manual/5/reference/procedures/#procedure_db_index_vector_queryNodes) + - `Query a vector index `_ + - `db.index.vector.queryNodes() `_ Args: - query_vector (Optional[list[float]], optional): The vector embeddings to get the closest neighbors of. Defaults to None. - query_text (Optional[str], optional): The text to get the closest neighbors of. Defaults to None. - top_k (int, optional): The number of neighbors to return. Defaults to 5. + query_vector (Optional[list[float]]): The vector embeddings to get the closest neighbors of. Defaults to None. + query_text (Optional[str]): The text to get the closest neighbors of. Defaults to None. + top_k (int): The number of neighbors to return. Defaults to 5. + filters (Optional[dict[str, Any]]): Filters for metadata pre-filtering. Defaults to None. Raises: ValueError: If validation of the input arguments fail. @@ -147,8 +166,30 @@ def search( class VectorCypherRetriever(Retriever): """ - Provides retrieval method using vector similarity and custom Cypher query. + Provides retrieval method using vector similarity augmented by a Cypher query. + This retriever builds on VectorRetriever. If an embedder is provided, it needs to have the required Embedder type. + + Example: + + .. code-block:: python + + import neo4j + from neo4j_genai import VectorCypherRetriever + + driver = neo4j.GraphDatabase.driver(URI, auth=AUTH) + + retrieval_query = "MATCH (node)-[:AUTHORED_BY]->(author:Author)" "RETURN author.name" + retriever = VectorCypherRetriever( + driver, "vector-index-name", retrieval_query, custom_embedder + ) + retriever.search(query_text="Find me a book about Fremen", top_k=5) + + Args: + driver (Driver): The Neo4j Python driver. + index_name (str): Vector index name. + retrieval_query (str): Cypher query that + embedder (Optional[Embedder]): Embedder object to embed query text. """ def __init__( @@ -194,22 +235,22 @@ def search( """Get the top_k nearest neighbor embeddings for either provided query_vector or query_text. See the following documentation for more details: - - [Query a vector index](https://neo4j.com/docs/cypher-manual/current/indexes-for-vector-search/#indexes-vector-query) - - [db.index.vector.queryNodes()](https://neo4j.com/docs/operations-manual/5/reference/procedures/#procedure_db_index_vector_queryNodes) + - `Query a vector index `_ + - `db.index.vector.queryNodes() `_ Args: - query_vector (Optional[list[float]], optional): The vector embeddings to get the closest neighbors of. Defaults to None. - query_text (Optional[str], optional): The text to get the closest neighbors of. Defaults to None. - top_k (int, optional): The number of neighbors to return. Defaults to 5. - query_params (Optional[dict[str, Any]], optional): Parameters for the Cypher query. Defaults to None. - filters (Optional[dict[str, Any]], optional): Filters for metadata pre-filtering.. Defaults to None. + query_vector (Optional[list[float]]): The vector embeddings to get the closest neighbors of. Defaults to None. + query_text (Optional[str]): The text to get the closest neighbors of. Defaults to None. + top_k (int): The number of neighbors to return. Defaults to 5. + query_params (Optional[dict[str, Any]]): Parameters for the Cypher query. Defaults to None. + filters (Optional[dict[str, Any]]): Filters for metadata pre-filtering. Defaults to None. Raises: ValueError: If validation of the input arguments fail. ValueError: If no embedder is provided. Returns: - list[neo4j.Record]: The results of the search query + list[VectorSearchRecord]: The `top_k` neighbors found in vector search with their nodes and scores. """ try: validated_data = VectorCypherSearchModel( diff --git a/src/neo4j_genai/types.py b/src/neo4j_genai/types.py index b9732454..bbcd8dff 100644 --- a/src/neo4j_genai/types.py +++ b/src/neo4j_genai/types.py @@ -26,6 +26,14 @@ class VectorSearchRecord(BaseModel): + """ + Represents a record returned from a vector search. + + Attributes: + node (Any): The node data retrieved by the search. + score (float): The similarity score of the retrieved embedding. + """ + node: Any score: float