Добавление отношения со свойствами нарушает другие запросы - PullRequest
0 голосов
/ 02 октября 2018

Я использовал стартер стека GRAND и недавно прошел модернизацию своих пакетов и базы данных Neo4j, чтобы они соответствовали текущим версиям, указанным в стартовом наборе GRAND.

Это, похоже, сломало мои самые основные запросы.Я создаю довольно простую демонстрационную базу данных для исследования, содержащую рецепты.У меня есть узел с рецептом, который включает в себя имя, инструкции и время.

Этот узел также имеет отношения, которые указывают, что это за еда и насколько она сложная.Вы можете видеть это ниже:

Illustraing simple relationships

Это прекрасно возвращается с моим запросом на входной стороне или в 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

И он добавляет его в базу данных очень хорошо.

Relationship successfully added.

Я такжея определил мои ингредиенты в моем graphql-schema.js следующим образом:

type Ingredient {
  name: String!
  quantity: String @cypher(statement:"MATCH (:Recipe)-[c:Contains]-(this) RETURN q.quantity")
  recipe: Recipe
}

До тех пор, пока я не обновил вещи, все эти элементы работали отлично.У меня было несколько рецептов, делящихся ингредиентами, из которых я мог запросить, запрос рецепта вернул бы все ингредиенты и количества по мере необходимости.Вы можете увидеть предыдущую итерацию базы данных на следующем изображении, и я могу подтвердить, что это действительно вернулось в игровую площадку graphql и мой интерфейс: Working relationships with properties

Так что я вродепоставил в тупик то, что могло бы произойти, или, если есть новый способ, я полагаю, буду делать эти вещи.Я мог бы откатиться, но так как это учебный процесс, я хочу поддерживать свои пакеты и базы данных в актуальном состоянии, чтобы справиться с этими трудностями.

Полная ошибка, возникающая в 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"
          ]
        }
      }
    }
  ]
}

1 Ответ

0 голосов
/ 02 октября 2018

Ошибка синтаксическая ошибка Cypher.Запрос, используемый в вашей директиве @cypher для Ingredient.quantity в определении схемы GraphQL, неверен, он ссылается на переменную q, которая не была определена.Поскольку quantity является свойством отношения Contains, а ваш запрос связывает c с этим отношением, запрос директивы @cypher должен быть

quantity: String @cypher(statement:"MATCH (:Recipe)-[c:Contains]-(this) RETURN c.quantity")

Кроме того, v1.0.1 из neo4j-graphql-js предлагает лучшую поддержку типов отношений, поэтому вам не нужно использовать директивы @cypher для доступа к свойствам отношений, вместо этого вы можете просто определить тип отношения: https://grandstack.io/docs/neo4j-graphql-js.html#relationships-with-properties

...