我使用的是GRAND堆栈启动器,最近通过升级软件包和Neo4j数据库来匹配GRAND入门工具包中确定的当前版本。
这似乎破坏了我最基本的查询。我正在创建一个相当简单的演示数据库,用于包含配方的探索。我有一个带有配方的节点,其中包括名称,说明和时间。
此节点还具有表明它是什么样的饭菜以及它有多难的关系。您可以在下面看到它:
对于我在前端或在Graphql Playground中的查询,使用以下查询返回的结果就很好:
query($searchQuery: String = "baked") {
RecipesBySubstring(searchQuery: $searchQuery) {
name
time
instructions
ingredients {
name
quantity
}
mealtype {
type
}
difficulty {
value
}
}
}
我的graphql-schema.js文件中的实际定义如下所示:
RecipesBySubstring(searchQuery: String): [Recipe] @cypher(statement:
"MATCH (r:Recipe) WHERE toLower(r.name) CONTAINS toLower($searchQuery) OR toLower(r.time) CONTAINS toLower($searchQuery) RETURN r ORDER BY r.name ASC")
但是,一旦我尝试创建具有属性的关系,它就无法使用这些确切的查询返回任何结果。我用此查询创建关系:
MATCH (r:Recipe{name:"baked spaghetti"}),(i:Ingredient{name:"beef"})
CREATE (r)-[c:Contains{quantity:"1 pound"}]->(i)
RETURN r,i,c
然后将其添加到数据库中即可。
我还在我的graphql-schema.js中定义了成分,如下所示:
type Ingredient {
name: String!
quantity: String @cypher(statement:"MATCH (:Recipe)-[c:Contains]-(this) RETURN q.quantity")
recipe: Recipe
}
直到我升级了东西,这些东西都运转良好。我有多个可以共享成分的配方,查询一个配方将返回所需的所有成分和数量。您可以在下图中看到数据库的上一个迭代,并且我可以确认它确实在graphql游乐场和前端中返回:
所以我很困惑可能发生的事情,或者如果我想采用一种新的方式来做这些事情。我可以回滚,但是由于这是一个学习过程,所以我想保持我的软件包和数据库最新以应对这些挑战。
当尝试查询与属性有关系的节点时,来自GraphQL Playground的完整错误如下:
{
"data": {
"RecipesBySubstring": null
},
"errors": [
{
"message": "Failed to invoke function `apoc.cypher.runFirstColumn`: Caused by: org.neo4j.cypher.internal.util.v3_4.SyntaxException: Variable `q` not defined (line 1, column 93 (offset: 92))",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"RecipesBySubstring"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
"exception": {
"code": "Neo.ClientError.Procedure.ProcedureCallFailed",
"name": "Neo4jError",
"stacktrace": [
"Neo4jError: Failed to invoke function `apoc.cypher.runFirstColumn`: Caused by: org.neo4j.cypher.internal.util.v3_4.SyntaxException: Variable `q` not defined (line 1, column 93 (offset: 92))",
"",
" at captureStacktrace (E:\\Recipe Snap\\grand-stack-starter\\api\\node_modules\\neo4j-driver\\lib\\v1\\result.js:200:15)",
" at new Result (E:\\Recipe Snap\\grand-stack-starter\\api\\node_modules\\neo4j-driver\\lib\\v1\\result.js:73:19)",
" at Session._run (E:\\Recipe Snap\\grand-stack-starter\\api\\node_modules\\neo4j-driver\\lib\\v1\\session.js:116:14)",
" at Session.run (E:\\Recipe Snap\\grand-stack-starter\\api\\node_modules\\neo4j-driver\\lib\\v1\\session.js:95:19)",
" at _callee$ (E:\\Recipe Snap\\grand-stack-starter\\api\\node_modules\\neo4j-graphql-js\\dist\\index.js:80:28)",
" at tryCatch (E:\\Recipe Snap\\grand-stack-starter\\api\\node_modules\\regenerator-runtime\\runtime.js:62:40)",
" at Generator.invoke [as _invoke] (E:\\Recipe Snap\\grand-stack-starter\\api\\node_modules\\regenerator-runtime\\runtime.js:296:22)",
" at Generator.prototype.(anonymous function) [as next] (E:\\Recipe Snap\\grand-stack-starter\\api\\node_modules\\regenerator-runtime\\runtime.js:114:21)",
" at step (E:\\Recipe Snap\\grand-stack-starter\\api\\node_modules\\babel-runtime\\helpers\\asyncToGenerator.js:17:30)",
" at E:\\Recipe Snap\\grand-stack-starter\\api\\node_modules\\babel-runtime\\helpers\\asyncToGenerator.js:35:14"
]
}
}
}
]
}
答案 0 :(得分:2)
该错误是Cypher语法错误。您的GraphQL模式定义中的@cypher
的{{1}}指令中使用的查询不正确,它引用的变量Ingredient.quantity
尚未定义。由于q
是quantity
关系的属性,并且您的查询将Contains
绑定到该关系,因此您的c
指令查询应该是
@cypher
此外,neo4j-graphql-js的v1.0.1引入了更好的关系类型支持,因此您不必使用quantity: String @cypher(statement:"MATCH (:Recipe)-[c:Contains]-(this) RETURN c.quantity")
指令来访问关系属性,而只需定义一个关系类型:{{3 }}