> ## Documentation Index
> Fetch the complete documentation index at: https://langchain-docs-zh.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Neo4j 向量索引集成

> 使用 LangChain JavaScript 集成 Neo4j vector index 向量存储

[Neo4j](https://neo4j.com/) 是一个开源的图数据库，集成了向量相似性搜索支持。它支持近似最近邻搜索、欧几里得距离和余弦相似度，以及结合向量和关键词检索的混合搜索。

本指南帮助你开始使用 Neo4j [向量存储](https://langchain-docs-zh.mintlify.site/langchain/oss/python/integrations/vectorstores.md)。有关所有 `Neo4jVectorStore` 功能和配置的详细文档，请参阅 [API 参考](https://reference.langchain.com/javascript/langchain-neo4j/Neo4jVectorStore)。

## 概述

### 集成详情

| 类 | 包 | [Python 支持](https://langchain-docs-zh.mintlify.site/langchain/oss/python/integrations/vectorstores/neo4jvector.md) | 下载量 | 版本 |
| :- | :- | :-: | :-: | :-: |
| [`Neo4jVectorStore`](https://reference.langchain.com/javascript/langchain-neo4j/Neo4jVectorStore) | [`@langchain/neo4j`](https://www.npmjs.com/package/@langchain/neo4j) | ✅ | ![NPM - 下载量](https://img.shields.io/npm/dm/@langchain/neo4j?style=flat-square\&label=%20&) | ![NPM - 版本](https://img.shields.io/npm/v/@langchain/neo4j?style=flat-square\&label=%20&) |

## 安装

安装 `@langchain/neo4j`（兼容 MongoDB 的 `neo4j-driver`），`@langchain/core`，以及一个嵌入提供商（本指南使用 [OpenAI 嵌入](https://langchain-docs-zh.mintlify.site/langchain/oss/python/integrations/embeddings/openai.md)）：

> [!TIP]
>
> 参见 [关于安装 LangChain 包的通用说明](https://langchain-docs-zh.mintlify.site/langchain/oss/langchain/install.md)。

```bash npm theme={null}
npm install @langchain/neo4j @langchain/core neo4j-driver @langchain/openai
```

```bash yarn theme={null}
yarn add @langchain/neo4j @langchain/core neo4j-driver @langchain/openai
```

```bash pnpm theme={null}
pnpm add @langchain/neo4j @langchain/core neo4j-driver @langchain/openai
```

### 使用 `docker-compose` 设置 `Neo4j` 自托管实例

`Neo4j` 提供了一个预构建的 Docker 镜像，可用于快速设置自托管的 Neo4j 数据库实例。
创建一个名为 `docker-compose.yml` 的文件：

```yml docker-compose.yml theme={null}
services:
  database:
    image: neo4j
    ports:
      - 7687:7687
      - 7474:7474
    environment:
      - NEO4J_AUTH=neo4j/pleaseletmein
```

然后在同一目录下，运行 `docker compose up` 来启动容器。

您可以在他们的 [网站](https://neo4j.com/docs/operations-manual/current/installation/) 上找到更多关于如何设置 `Neo4j` 的信息。

## 使用

```typescript theme={null}
import { OpenAIEmbeddings } from "@langchain/openai";
import { Neo4jVectorStore } from "@langchain/neo4j";

// Configuration object for Neo4j connection and other related settings
const config = {
  url: "bolt://localhost:7687", // URL for the Neo4j instance
  username: "neo4j", // Username for Neo4j authentication
  password: "pleaseletmein", // Password for Neo4j authentication
  indexName: "vector", // Name of the vector index
  keywordIndexName: "keyword", // Name of the keyword index if using hybrid search
  searchType: "vector" as const, // Type of search (e.g., vector, hybrid)
  nodeLabel: "Chunk", // Label for the nodes in the graph
  textNodeProperty: "text", // Property of the node containing text
  embeddingNodeProperty: "embedding", // Property of the node containing embedding
};

const documents = [
  { pageContent: "what's this", metadata: { a: 2 } },
  { pageContent: "Cat drinks milk", metadata: { a: 1 } },
];

const neo4jVectorIndex = await Neo4jVectorStore.fromDocuments(
  documents,
  new OpenAIEmbeddings(),
  config
);

const results = await neo4jVectorIndex.similaritySearch("water", 1);

console.log(results);

/*
  [ Document { pageContent: 'Cat drinks milk', metadata: { a: 1 } } ]
*/

await neo4jVectorIndex.close();
```

### 使用 retrievalQuery 参数自定义响应

```typescript theme={null}
import { OpenAIEmbeddings } from "@langchain/openai";
import { Neo4jVectorStore } from "@langchain/neo4j";

/*
 * The retrievalQuery is a customizable Cypher query fragment used in the Neo4jVectorStore class to define how
 * search results should be retrieved and presented from the Neo4j database. It allows developers to specify
 * the format and structure of the data returned after a similarity search.
 * Mandatory columns for `retrievalQuery`:
 *
 * 1. text:
 *    - Description: Represents the textual content of the node.
 *    - Type: String
 *
 * 2. score:
 *    - Description: Represents the similarity score of the node in relation to the search query. A
 *      higher score indicates a closer match.
 *    - Type: Float (ranging between 0 and 1, where 1 is a perfect match)
 *
 * 3. metadata:
 *    - Description: Contains additional properties and information about the node. This can include
 *      any other attributes of the node that might be relevant to the application.
 *    - Type: Object (key-value pairs)
 *    - Example: { "id": "12345", "category": "Books", "author": "John Doe" }
 *
 * Note: While you can customize the `retrievalQuery` to fetch additional columns or perform
 * transformations, never omit the mandatory columns. The names of these columns (`text`, `score`,
 * and `metadata`) should remain consistent. Renaming them might lead to errors or unexpected behavior.
 */

// Configuration object for Neo4j connection and other related settings
const config = {
  url: "bolt://localhost:7687", // URL for the Neo4j instance
  username: "neo4j", // Username for Neo4j authentication
  password: "pleaseletmein", // Password for Neo4j authentication
  retrievalQuery: `
    RETURN node.text AS text, score, {a: node.a * 2} AS metadata
  `,
};

const documents = [
  { pageContent: "what's this", metadata: { a: 2 } },
  { pageContent: "Cat drinks milk", metadata: { a: 1 } },
];

const neo4jVectorIndex = await Neo4jVectorStore.fromDocuments(
  documents,
  new OpenAIEmbeddings(),
  config
);

const results = await neo4jVectorIndex.similaritySearch("water", 1);

console.log(results);

/*
  [ Document { pageContent: 'Cat drinks milk', metadata: { a: 2 } } ]
*/

await neo4jVectorIndex.close();
```

### 从现有图谱中实例化 Neo4jVectorStore

```typescript theme={null}
import { OpenAIEmbeddings } from "@langchain/openai";
import { Neo4jVectorStore } from "@langchain/neo4j";

/**
 * `fromExistingGraph` Method:
 *
 * Description:
 * This method initializes a `Neo4jVectorStore` instance using an existing graph in the Neo4j database.
 * It's designed to work with nodes that already have textual properties but might not have embeddings.
 * The method will compute and store embeddings for nodes that lack them.
 *
 * Note:
 * This method is particularly useful when you have a pre-existing graph with textual data and you want
 * to enhance it with vector embeddings for similarity searches without altering the original data structure.
 */

// Configuration object for Neo4j connection and other related settings
const config = {
  url: "bolt://localhost:7687", // URL for the Neo4j instance
  username: "neo4j", // Username for Neo4j authentication
  password: "pleaseletmein", // Password for Neo4j authentication
  indexName: "wikipedia",
  nodeLabel: "Wikipedia",
  textNodeProperties: ["title", "description"],
  embeddingNodeProperty: "embedding",
  searchType: "hybrid" as const,
};

// You should have a populated Neo4j database to use this method
const neo4jVectorIndex = await Neo4jVectorStore.fromExistingGraph(
  new OpenAIEmbeddings(),
  config
);

await neo4jVectorIndex.close();
```

### 元数据过滤

```typescript theme={null}
import { OpenAIEmbeddings } from "@langchain/openai";
import { Neo4jVectorStore } from "@langchain/neo4j";

/**
 * `similaritySearch` Method with Metadata Filtering:
 *
 * Description:
 * This method facilitates advanced similarity searches within a Neo4j vector index, leveraging both text embeddings and metadata attributes.
 * The third parameter, `filter`, allows for the specification of metadata-based conditions that pre-filter the nodes before performing the similarity search.
 * This approach enhances the search precision by allowing users to query based on complex metadata criteria alongside textual similarity.
 * Metadata filtering also support the following operators:
 *
 *  $eq: Equal
 *  $ne: Not Equal
 *  $lt: Less than
 *  $lte: Less than or equal
 *  $gt: Greater than
 *  $gte: Greater than or equal
 *  $in: In a list of values
 *  $nin: Not in a list of values
 *  $between: Between two values
 *  $like: Text contains value
 *  $ilike: lowered text contains value
 *
 * The filter supports a range of query operations such as equality checks, range queries, and compound conditions (using logical operators like $and, $or).
 * This makes it highly adaptable to varied use cases requiring detailed and specific retrieval of documents based on both content and contextual information.
 *
 * Note:
 * Effective use of this method requires a well-structured Neo4j database where nodes are enriched with both text and metadata properties.
 * The method is particularly useful in scenarios where the integration of text analysis with detailed metadata querying is crucial, such as in content recommendation systems, detailed archival searches, or any application where contextual relevance is key.
 */

// Configuration object for Neo4j connection and other related settings
const config = {
  url: "bolt://localhost:7687", // URL for the Neo4j instance
  username: "neo4j", // Username for Neo4j authentication
  password: "pleaseletmein", // Password for Neo4j authentication
  indexName: "vector", // Name of the vector index
  keywordIndexName: "keyword", // Name of the keyword index if using hybrid search
  searchType: "vector" as const, // Type of search (e.g., vector, hybrid)
  nodeLabel: "Chunk", // Label for the nodes in the graph
  textNodeProperty: "text", // Property of the node containing text
  embeddingNodeProperty: "embedding", // Property of the node containing embedding
};

const documents = [
  { pageContent: "what's this", metadata: { a: 2 } },
  { pageContent: "Cat drinks milk", metadata: { a: 1 } },
];

const neo4jVectorIndex = await Neo4jVectorStore.fromDocuments(
  documents,
  new OpenAIEmbeddings(),
  config
);

const filter = { a: { $eq: 1 } };
const results = await neo4jVectorIndex.similaritySearch("water", 1, { filter });

console.log(results);

/*
  [ Document { pageContent: 'Cat drinks milk', metadata: { a: 1 } } ]
*/

await neo4jVectorIndex.close();
```

## 安全

确保数据库连接使用权限范围狭窄的凭证。
如果未能做到这一点，可能会导致数据损坏或丢失，因为调用代码可能会尝试执行导致删除、修改数据的命令，或者如果数据库中存在敏感数据，则读取敏感数据。
防止此类负面结果的最佳方法是为与此工具一起使用的凭证（根据需要）限制权限。
例如，为数据库创建只读用户是确保调用代码无法修改或删除数据的好方法。

## API 参考

有关所有 `Neo4jVectorStore` 功能和配置的详细文档，请参阅 [API 参考](https://reference.langchain.com/javascript/langchain-neo4j/Neo4jVectorStore)。

## 相关

* 向量存储 [概念指南](https://langchain-docs-zh.mintlify.site/langchain/oss/python/integrations/vectorstores.md)
* 向量存储 [操作指南](https://langchain-docs-zh.mintlify.site/langchain/oss/python/integrations/vectorstores.md)

***

> 官方原文：[src/oss/javascript/integrations/vectorstores/neo4jvector.mdx](https://github.com/langchain-ai/docs/blob/main/src/oss/javascript/integrations/vectorstores/neo4jvector.mdx) · 非官方翻译，译文由 AI 生成，以英文原文为准。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.