2016-02-09 2 views
0

Я работаю над проектом, целью которого является создание системы для извлечения биомедицинской информации (например, биомедицинских объектов, таких как наркотики, болезни и гены, а также взаимоотношения между ними). Когда я попытался получить базу данных, чтобы найти конкретное заболевание, используя оператор cypher:Neo4j: неверный ввод в cypher

Для cypher string "MATCH (m: Disease) WHERE m.disease_name = ~ '(? I)" + disease + "' RETURN m" ;

если болезнь с названием «2'-бензоилоксициннальдегид» или «4- [1-ALLYL-7- (TRIFLUOROMETHYL) -1H-INDAZOL-3-YL] BENZENE-1,3-DIOL», исключения произойдет с сообщениями следующим образом:

Недопустимый ввод '' ': ожидается 0..9,'. ',' e ',' E ', символ идентификатора, пробелы, метки узлов,' [', "= ~ ", IN, STARTS, ENDS, CONTAINS, IS, '^', '*', '/', '%', '+', '-', '='," <> ","! = " , '<', '>', "< =", "> =", AND, XOR, OR, LOAD CSV, START, MATCH, UNWIND, MERGE, CREATE, SET, DELETE, REMOVE, FOREACH, WITH, RETURN, UNION, ';' или конец ввода (строка 1, столбец 53 (смещение: 52)) «MATCH (n1: Drug) - [x] - (n2: Disease) RETURN n1 LIMIT 25" "

Как я могу исправить эту проблему ? Спасибо огромное!

+0

Я хотел бы предложить использовать параметры MATCH (м: Disease), где М.disease_name = ~ {diseaseName} RETURN m $ params ['diseaseName'] = '(? i)'. $ diseaseName; , а затем передать этот параметр в запрос cypher, потому что, если мы используем params, тогда сиггер-синтаксис не видит их – user3542450

+0

Это просто на догадку: вы также можете попытаться заменить болезнь tostring (болезнь) в вас cypher query – manonthemat

+0

Похоже, у вас есть странная цитата, которая попадает в запрос ... Я бы предположил, кстати, использование параметров Cypher, если есть вероятность, что переменная «болезнь» может возникнуть из ненадежного источника. Это также может повысить производительность запросов. http://neo4j.com/docs/stable/cypher-parameters.html –

ответ

0

Вы на самом деле есть 2 разных запросов, и они имеют различные проблемы:

  1. Первый запрос генерируется этим утверждением:

    "MATCH (m:Disease) WHERE m.disease_name =~ '(?i)"+disease+"' RETURN m"; 
    

    Поскольку вы используете одинарные кавычки в регулярном выражении строковый разделитель, если значение disease содержит одиночную кавычку, то это слишком рано заканчивает регулярное выражение. У вас есть несколько вариантов, перечисленных в увеличении качества:

    • побега (используя предшествующую обратную косую черту) все единичные кавычки в disease.
    • Использовать двойные кавычки в качестве разделителя строк регулярного выражения (что также требует escape-символов, но disease не нужно изменять). Я предполагаю, что disease (который на самом деле, кажется, химическое название) никогда не будет включать в себя двойные кавычки:

      "MATCH (m:Disease) WHERE m.disease_name =~ \"(?i)" + disease + "\"RETURN m"; 
      
    • Передайте значение disease как parameter. Не требуется экранирование, и запрос будет быстрее, если вам нужно сделать по существу один и тот же запрос несколько раз. Однако значение переданного параметра должно начинаться с «(? I)».

      "MATCH (m: Disease) WHERE m.disease_name = ~ {disease} RETURN m";

  2. Ваш второй запрос имеет одинаковую опечатку. Он имеет дополнительные двойные кавычки в конце:

    "MATCH (n1:Drug)-[x]-(n2:Disease) RETURN n1 LIMIT 25"" 
    

    Оно должно быть:

    "MATCH (n1:Drug)-[x]-(n2:Disease) RETURN n1 LIMIT 25" 
    
+0

Спасибо всем за ваши комментарии! Они очень полезны для меня! – Amber