Запрос шифрования Neo4j не выполняется с неизвестной синтаксической ошибкой - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть следующие paramObj и dbQuery

 paramObj = {
                    email:         newUser.email, 
                    mobilenumber:  newUser.telephone,
                    password:      newUser.password,
                    category:      newUser.category,
                    name:          newUser.name,
                    confirmuid:    verificationHash,
                    confirmexpire: expiryDate.valueOf(),
                    rewardPoints:       0, 
                    emailconfirmed:    'false',
                    paramVehicles:      makeVehicleArray,  
                    paramVehicleProps:  vehiclePropsArray
                     }
dbQuery = `CREATE (user:Person:Owner {email:$email})                                    
           SET  user += apoc.map.clean(paramObj, 
                 ['email','paramVehicles','paramVehiclesProps'],[])
           WITH user, $paramVehicles AS vehicles
            UNWIND vehicles AS vehicle
            MATCH(v:Vehicles {name:vehicle}) 
            CREATE UNIQUE (user)-[r:OWNS {since: timestamp()}]->(v)
            RETURN user,r,v`;

Затем я попытался выполнить

 commons.session
              .run(dbQuery, paramObj)
              .then(newUser => {
                  commons.session.close();
                  if (!newUser.records[0]) {........

Я получаю

Error:  {"code":"Neo.ClientError.Statement.SyntaxError","name":"Neo4jError"}

, который не указываетменя где угодноМожет кто-нибудь сказать мне, что я здесь делаю не так?

Это первый раз, когда я использую формат запроса .run(dbQuery, paramObj), но этот формат имеет решающее значение для моего варианта использования.Я использую сообщество Neo4j 3.4.5 с установленным плагином apoc.

Хорошо ... поэтому я следовал предложению @inversFalcon для тестирования в браузере и нашел следующие параметры и запрос, которые точно соответствуют приведенным выше:

   :params paramObj:[{ email:"xyz123@abc.com", mobilenumber:"8711231234",password:"password1", category:"Owner",name:"Michaell",vehicles:["Toyota","BMW","Nissan"],vehicleProps: [] }]

и запрос

PROFILE
CREATE (user:Person:Owner {email:$email})
SET  user += apoc.map.clean($paramObj, ["email","vehicles","vehicleProps"],[])
WITH user, $vehicles AS vehicles
UNWIND vehicles AS vehicle
MATCH(v:Vehicles {name:vehicle})
MERGE (user)-[r:OWNS {since: timestamp()}]->(v)
RETURN user,r,v;

Теперь я получаю Neo.ClientError.Statement.TypeError: Невозможно выполнить `List {Map {name -> String (" Michaell ")), транспортные средства -> List {String ("Toyota"), String ("BMW"), String ("Nissan")}, .......

Я также вернулся к neo4j 3.2 (re: предыдущий постМарк Нидхэм) и получил ту же ошибку.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Я не уверен, что привело к исчезновению ошибки приведения, но это произошло с тем же запросом, и я получил «ожидаемую ошибку параметра», которая была исправлена ​​с помощью $ paramObj.email и т. Д., Поэтому итоговый запрос выглядит следующим образом:

CREATE (user:Person:Owner {email: $paramObj.email})
SET  user += apoc.map.clean($queryObj, ["email","vehicles","vehicleProps"],[])
WITH user, $paramObj.vehicles AS vehicles
UNWIND vehicles AS vehicle
MATCH(v:Vehicles {name:vehicle})
MERGE (user)-[r:OWNS {since: timestamp()}]->(v)
RETURN user,r,v;

, которая исправила мою первоначальную проблему удаления свойств с карты при использовании SET + = map.

0 голосов
/ 23 ноября 2018

Вы должны попытаться выполнить ОБЪЯСНЕНИЕ запроса с помощью браузера, чтобы устранить его.

Несколько вещей, которые я вижу здесь:

Вы имеете в виду paramObj, но это не параметр (точнее, это карта параметров, которую вы передаете, но сама она не является параметром, на который вы можете ссылаться в запросе).Если вам нужно сослаться на весь набор передаваемых параметров, то вам нужно использовать вложенные карты и иметь paramObj ключ на карте, который вы передаете в качестве карты параметров (и когда вы используете его в запросе).вам нужно будет использовать $paramObj)

CREATE UNIQUE устарело, вместо этого следует использовать MERGE, хотя имейте в виду, что он ведет себя по-другому (см. документацию MERGE), а также наша статья в базе знаний, объясняющая некоторые простые детали , как работает MERGE ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...