将强大的 GraphQL 的灵活性与稳健的 Neo4j 图数据库无缝集成,构建以 API 为驱动的智能应用程序。
不熟悉 Cypher?没问题。GraphQL 会自动将查询转换为单个优化的 Cypher 查询。您只需专注于构建应用程序,编写最少的后端代码,其余工作由 Neo4j GraphQL 处理。
构建上下文感知的应用程序,利用与图数据库无缝衔接且丰富的数据图原生 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
}
}
}
}