将强大的 GraphQL 的灵活性与强大的 Neo4j 图数据库无缝集成,构建 API 驱动的智能应用程序。
不熟悉 Cypher?没问题。GraphQL 自动将查询转换为单个优化的 Cypher 查询。专注于使用最少的后端代码构建应用程序,其余部分由 Neo4j GraphQL 处理。
使用数据丰富的、图原生的 API 构建上下文感知应用程序,这些 API 与图数据库无缝对齐。Neo4j 与 GraphQL 结合可实现更深入的洞察、更智能的推荐和更动态的用户体验。
Neo4j GraphQL 从 GraphQL 生成 Cypher,从类型定义生成 GraphQL CRUD API,自动生成解析器,并通过 @cypher 模式指令实现自定义逻辑。它还具有强大的授权功能,可保护您的 GraphQL API。
Neo4j GraphQL 可作为 AuraDB 中的服务或库格式提供。您可以快速构建跨开源框架(React、Vue、Angular 等)的 API 驱动应用程序,并实现出色的灵活性。可在本地、云端或无服务器设置中部署。
根据您的类型定义自动创建查询 (Query) 和变动 (Mutation) 类型,以提供即时 CRUD 功能。
配置和扩展 GraphQL CRUD API,以使用相同的类型定义来帮助定义数据库模式和 GraphQL 模式。
type Movie {
title: String!
actors: [Person!]!
@relationship(type: "ACTED_IN", direction: IN)
}
type Person {
name: String!
}
生成单个 Cypher 查询以解析任何任意的 GraphQL 请求。
这意味着解析器会针对您的场景自动实现。无需编写样板数据获取代码。GraphQL 生成数据库查询并处理数据库调用。由于生成的是单个 Cypher 查询,这极大地提高了性能并解决了 N+1 查询问题。
{
movies(where: { title: "River Runs Through It" }) {
title
actors {
name
}
}
}
MATCH (m:Movie)<-[:ACTED_IN]-(a:Actor)
WHERE m.title = "River Runs Through It"
RETURN *
由于 GraphQL 是一种 API 查询语言而非数据库查询语言,它缺乏聚合、投影和更复杂的图遍历等操作的语义。
使用带有 GraphQL 模式指令的 @cypher 扩展 GraphQL 的功能,将 Cypher 查询的结果绑定到 GraphQL 字段。这允许使用 Cypher 表达复杂逻辑,并允许查询 (Query) 和变动 (Mutation) 字段定义自定义数据获取或变动逻辑。
Neo4j 原生图数据库使复杂的多跳图遍历具有高性能,提供极速查询响应
type Movie {
title: String!
actors: [Person!]!
@relationship(type: "ACTED_IN", direction: IN)
similar(first: Int = 3): [Movie!]!
@cypher(
statement: """
MATCH (this)<-[:ACTED_IN|:DIRECTED]-(o)-[:ACTED_IN|:DIRECTED]->(rec:Movie)
WITH rec, COUNT(*) AS score
RETURN rec ORDER BY score DESC LIMIT $first
"""
)
}
type Person {
name: String!
}
使用开箱即用的 Auth 指令,通过 JSON Web Tokens (JWT) 为 GraphQL API 启用授权规则。
Auth 指令降低了构建安全 GraphQL API 的复杂性。Auth 提供了一个可行的解决方案,帮助用户快速轻松地“启动”安全服务。
此外,Cypher 的强大功能有效地将复杂授权规则转换为单个 Cypher 查询。
type Movie {
title: String!
actors: [Person!]!
@relationship(type: "ACTED_IN", direction: IN)
}
type Person {
name: String!
}
extend type Movie
@auth(
rules: [{ operations: [UPDATE], allow: { actors: { name: "$jwt.sub" } } }]
)
在数据模型中添加关系可以为您的数据提供上下文,以便在图的广泛部分运行复杂查询。
使用 Neo4j 和 GraphQL 定义一个表示您的关系属性的接口。您可以通过将 properties 键添加到现有关系指令中,将其用于多个关系。
简化开发工作,并以最小的精力实现可扩展、灵活的应用程序。
type Movie {
title: String!
actors: [Person!]!
@relationship(type: "ACTED_IN", direction: IN, properties: "ActedIn")
}
type Person {
name: String!
}
interface ActedIn {
roles: [String!]!
}
基于游标的分页是前端实现无限滚动的首选方法。
基于游标的分页的最大优势在于它如何有效处理实时数据变化。当您添加或删除记录时,游标不要求数据保持静态。因此,每个新页面仍然可以正确加载。
获取所有关系字段的基于游标的分页,并包含您已经熟悉的过滤和排序功能。
{
movies(where: { title: "River Runs Through It" }) {
title
actorsConnection(first: 10, after: "opaqueCursor") {
edges {
roles
node {
name
}
}
pageInfo {
endCursor
hasNextPage
}
}
}
}