生成式AI助手过程

用自然语言查询

此过程 apoc.ml.query 接受自然语言问题,并返回该查询的结果。

它使用 chat/completions API,其文档在此

查询调用
CALL apoc.ml.query("What movies did Tom Hanks play in?") yield value, query
RETURN *
示例响应
+------------------------------------------------------------------------------------------------------------------------------+
| value                                 | query                                                                                |
+------------------------------------------------------------------------------------------------------------------------------+
| {m.title -> "You've Got Mail"}        | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
| {m.title -> "Apollo 13"}              | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
| {m.title -> "Joe Versus the Volcano"} | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
| {m.title -> "That Thing You Do"}      | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
| {m.title -> "Cloud Atlas"}            | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
| {m.title -> "The Da Vinci Code"}      | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
| {m.title -> "Sleepless in Seattle"}   | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
| {m.title -> "A League of Their Own"}  | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
| {m.title -> "The Green Mile"}         | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
| {m.title -> "Charlie Wilson's War"}   | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
| {m.title -> "Cast Away"}              | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
| {m.title -> "The Polar Express"}      | "cypher
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person {name: 'Tom Hanks'})
RETURN m.title
" |
+------------------------------------------------------------------------------------------------------------------------------+
12 rows
表1. 输入参数
名称 描述

问题

自然语言的问题

配置

可选的配置映射,请参阅下一节

表2. 配置映射
名称 描述 强制的

重试次数

API 调用失败时的重试次数

否,默认 3

发生错误时重试

如果为 true,则在发生错误时重试 API,并在请求体中添加以下消息:{"role":"user", "content": "The previous Cypher Statement throws the following error, consider it to return the correct statement: `<errorMessage>`"}, {"role":"assistant", "content":"Cypher Statement (in backticks):"}

否,默认 false

API密钥

OpenAI API 密钥

如果未定义 apoc.openai.key

模型

OpenAI 模型

否,默认 gpt-4o

样本

要跳过的节点数量,例如,样本为 1000 时将读取每 1000 个节点中的一个。它用作计算图模式的 apoc.meta.data 过程的参数。

否,默认是一个随机数

表3. 结果
名称 描述

查询结果

cypher

用于计算结果的查询

我们可以使用 additionalPrompts 配置来改进请求,例如添加图模式的自然语言描述(比如 apoc.ml.schema 的输出)。由于 OpenAI 主要被训练用于处理自然语言问题,而不是 Cypher 查询,因此使用此配置可以获得更好的结果。例如,给定Northwind 数据集,我们可以执行

查询调用
CALL apoc.ml.schema({apiKey: $apiKey}) YIELD value
WITH value
CALL apoc.ml.query("Which 5 employees had sold the product 'Chocolade' and has the highest selling count of another product?
  Please returns the employee identificator, the other product name and the count orders of another product",
{
    retries: 8,
    retryWithError: true,
    apiKey: $apiKey,
    additionalPrompts: [
        {role: "system", content: "The human description of the schema is the following:\n" + value}
    ]
})
YIELD query, value RETURN query, value

结果类似于以下内容。

结果是非确定性的,每次重新执行查询时可能会发生变化
表4. 结果
查询

"cypher MATCH (p:Product {productName: 'Chocolade'})←[:CONTAINS]-(:Order)←[:SOLD]-(e:Employee) MATCH (e)-[:SOLD]→(o:Order)-[:CONTAINS]→(p2:Product) WITH e, p2, COUNT(DISTINCT o) AS orderCount ORDER BY orderCount DESC RETURN e.employeeID AS employeeID, p2.productName AS otherProduct, orderCount LIMIT 5 "

{ "otherProduct": "Gnocchi di nonna Alice", "employeeID": "4", "orderCount": 14 }

"cypher MATCH (p:Product {productName: 'Chocolade'})←[:CONTAINS]-(:Order)←[:SOLD]-(e:Employee) MATCH (e)-[:SOLD]→(o:Order)-[:CONTAINS]→(p2:Product) WITH e, p2, COUNT(DISTINCT o) AS orderCount ORDER BY orderCount DESC RETURN e.employeeID AS employeeID, p2.productName AS otherProduct, orderCount LIMIT 5 "

{ "otherProduct": "Pâté chinois", "employeeID": "4", "orderCount": 12 }

"cypher MATCH (p:Product {productName: 'Chocolade'})←[:CONTAINS]-(:Order)←[:SOLD]-(e:Employee) MATCH (e)-[:SOLD]→(o:Order)-[:CONTAINS]→(p2:Product) WITH e, p2, COUNT(DISTINCT o) AS orderCount ORDER BY orderCount DESC RETURN e.employeeID AS employeeID, p2.productName AS otherProduct, orderCount LIMIT 5 "

{ "otherProduct": "Gumbär Gummibärchen", "employeeID": "3", "orderCount": 12 }

"cypher MATCH (p:Product {productName: 'Chocolade'})←[:CONTAINS]-(:Order)←[:SOLD]-(e:Employee) MATCH (e)-[:SOLD]→(o:Order)-[:CONTAINS]→(p2:Product) WITH e, p2, COUNT(DISTINCT o) AS orderCount ORDER BY orderCount DESC RETURN e.employeeID AS employeeID, p2.productName AS otherProduct, orderCount LIMIT 5 "

{ "otherProduct": "Flotemysost", "employeeID": "1", "orderCount": 12 }

"cypher MATCH (p:Product {productName: 'Chocolade'})←[:CONTAINS]-(:Order)←[:SOLD]-(e:Employee) MATCH (e)-[:SOLD]→(o:Order)-[:CONTAINS]→(p2:Product) WITH e, p2, COUNT(DISTINCT o) AS orderCount ORDER BY orderCount DESC RETURN e.employeeID AS employeeID, p2.productName AS otherProduct, orderCount LIMIT 5 "

{ "otherProduct": "Pavlova", "employeeID": "1", "orderCount": 11 }

与不使用自然语言图模式描述的过程相比,输出的幻觉更少,例如由不同标签持有的属性以及与其他实体关联的关系。

用自然语言描述图模式

此过程 apoc.ml.schema 返回基础数据集的自然语言描述。

它使用 chat/completions API,其文档在此

查询调用
CALL apoc.ml.schema() yield value
RETURN *
示例响应
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| value                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| "The graph database schema represents a system where users can follow other users and review movies. Users (:Person) can either follow other users (:Person) or review movies (:Movie). The relationships allow users to express their preferences and opinions about movies. This schema can be compared to social media platforms where users can follow each other and leave reviews or ratings for movies they have watched. It can also be related to movie recommendation systems where user preferences and reviews play a crucial role in generating personalized recommendations." |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row
表5. 输入参数
名称 描述

配置

可选的配置映射,请参阅下一节

表6. 配置映射
名称 描述 强制的

API密钥

OpenAI API 密钥

如果未定义 apoc.openai.key

模型

OpenAI 模型

否,默认 gpt-4o

样本

要跳过的节点数量,例如,样本为 1000 时将读取每 1000 个节点中的一个。它用作计算图模式的 apoc.meta.data 过程的参数。

否,默认是一个随机数

表7. 结果
名称 描述

数据集的描述

从自然语言查询创建 Cypher 查询

此过程 apoc.ml.cypher 接受自然语言问题,并将其转换为若干请求的 Cypher 查询。

它使用 chat/completions API,其文档在此

查询调用
CALL apoc.ml.cypher("Who are the actors which also directed a movie?", {count: 4}) yield cypher
RETURN *
示例响应
+----------------------------------------------------------------------------------------------------------------+
| query                                                                                                          |
+----------------------------------------------------------------------------------------------------------------+
| "
MATCH (a:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person)
RETURN a.name as actor, d.name as director
" |
| "cypher
MATCH (a:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(a)
RETURN a.name
"                               |
| "
MATCH (a:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person)
RETURN a.name
"                              |
| "cypher
MATCH (a:Person)-[:ACTED_IN]->(:Movie)<-[:DIRECTED]-(a)
RETURN DISTINCT a.name
"                       |
+----------------------------------------------------------------------------------------------------------------+
4 rows
表8. 输入参数
名称 描述 强制的

问题

自然语言的问题

配置

可选的配置映射,请参阅下一节

表9. 配置映射
名称 描述 强制的

数量

要检索的查询数量

否,默认 1

API密钥

OpenAI API 密钥

如果未定义 apoc.openai.key

模型

OpenAI 模型

否,默认 gpt-4o

样本

要跳过的节点数量,例如,样本为 1000 时将读取每 1000 个节点中的一个。它用作计算图模式的 apoc.meta.data 过程的参数。

否,默认是一个随机数

表10. 结果
名称 描述

数据集的描述

我们可以使用 additionalPrompts 配置来改进请求,例如添加图模式的自然语言描述(比如 apoc.ml.schema 的输出)。由于 OpenAI 主要被训练用于处理自然语言问题,而不是 Cypher 查询,因此使用此配置可以获得更好的结果。例如,给定Northwind 数据集,我们可以执行

查询调用
CALL apoc.ml.schema({apiKey: $apiKey}) YIELD value
WITH value
CALL apoc.ml.cypher("Which 5 employees had sold the product 'Chocolade' and has the highest selling count of another product?
  Please returns the employee identificator, the other product name and the count orders of another product",
{
  count: 1,
  apiKey: $apiKey,
  additionalPrompts: [
    {role: "system", content: "The human description of the schema is the following:\n" + value}
  ]
})
YIELD value RETURN value

结果类似于以下内容。

结果是非确定性的,每次重新执行查询时可能会发生变化
表11. 结果

MATCH (p:Product {productName: 'Chocolade'})←[:CONTAINS]-(o:Order)←[:SOLD]-(e:Employee) MATCH (e)-[:SOLD]→(o2:Order)-[:CONTAINS]→(p2:Product) WITH e, p2, COUNT(DISTINCT o2) AS ordersCnt ORDER BY ordersCnt DESC RETURN e.employeeID AS employeeID, p2.productName AS otherProduct, ordersCnt LIMIT 5

与不使用自然语言图模式描述的过程相比,输出的幻觉更少,例如由不同标签持有的属性以及与其他实体关联的关系。

从 Cypher 查询创建自然语言查询解释

此过程 apoc.ml.fromCypher 接受自然语言问题,并将其转换为自然语言查询解释。

它使用 chat/completions API,其文档在此

查询调用
CALL apoc.ml.cypher("MATCH (p:Person {name: "Tom Hanks"})-[:ACTED_IN]->(m:Movie) RETURN m", {}) yield value
RETURN *
表12. 示例响应

此数据库模式代表了一个简化的常见电影数据库模型。movie 节点代表一个电影实体,其属性包括上映年份、宣传语和电影标题。person 节点代表电影行业中的人物,其属性为人出生年份和姓名。directed 关系连接一个 person 节点到 movie 节点,表示该人物导演了该电影。在领域方面,此模式与娱乐产业,特别是电影产业相关。电影和参与创作电影的人物是此领域的基本实体。directed 关系捕获了人物与电影之间的导演关系。此类模型可以扩展以包含其他关系,如 acted_inproducedwrote 等,以捕获电影行业内更复杂的连接。总而言之,此图数据库模式提供了一种简单但强大的方式来表示电影领域的实体和关系,从而可以查询和分析行业内的连接。

表13. 输入参数
名称 描述 强制的

cypher

自然语言的问题

配置

可选的配置映射,请参阅下一节

表14. 配置映射
名称 描述 强制的

重试次数

API 调用失败时的重试次数

否,默认 3

API密钥

OpenAI API 密钥

如果未定义 apoc.openai.key

模型

OpenAI 模型

否,默认 gpt-4o

样本

要跳过的节点数量,例如,样本为 1000 时将读取每 1000 个节点中的一个。它用作计算图模式的 apoc.meta.data 过程的参数。

否,默认是一个随机数

表15. 结果
名称 描述

数据集的描述

从一组查询创建子图解释

此过程 apoc.ml.fromQueries 返回给定查询集的自然语言解释。

它使用 chat/completions API,其文档在此

查询调用
CALL apoc.ml.fromQueries(['MATCH (n:Movie) RETURN n', 'MATCH (n:Person) RETURN n'],
    {apiKey: <apiKey>})
YIELD value
RETURN *
示例响应
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| value                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| "The database represents movies and people, like in a movie database or social network.
    There are no defined relationships between nodes, allowing flexibility for future connections.
    The Movie node includes properties like title, tagline, and release year." |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row
带路径的查询调用
CALL apoc.ml.fromQueries(['MATCH (n:Movie) RETURN n', 'MATCH p=(n:Movie)--() RETURN p'],
    {apiKey: <apiKey>})
YIELD value
RETURN *
示例响应
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| value                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| "models relationships in the movie industry, connecting :Person nodes to :Movie nodes.
    It represents actors, directors, writers, producers, and reviewers connected to movies they are involved with.
    Similar to a social network graph but specialized for the entertainment industry.
    Each relationship type corresponds to common roles in movie production and reviewing.
    Allows for querying and analyzing connections and collaborations within the movie business." |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row
表16. 输入参数
名称 描述

查询

查询列表

配置

可选的配置映射,请参阅下一节

表17. 配置映射
名称 描述 强制的

API密钥

OpenAI API 密钥

如果未定义 apoc.openai.key

模型

OpenAI 模型

否,默认 gpt-4o

样本

要跳过的节点数量,例如,样本为 1000 时将读取每 1000 个节点中的一个。它用作计算图模式的 apoc.meta.data 过程的参数。

否,默认是一个随机数

表18. 结果
名称 描述

数据集的描述

© . All rights reserved.