我正致力于一个项目,旨在建立一个系统来检索生物医学信息(例如生物医学实体,如药物,疾病和基因,以及它们之间的关系)。当我尝试使用cypher语句检索数据库以查找特定疾病时:
对于密码字符串" MATCH(m:Disease)WHERE m.disease_name =〜'(?i)" + disease +"'返回m";
如果疾病的名称为" 2' -benzoyloxycinnamaldehyde"或者" 4- [1-烯丙基-7-(三氟甲基)-1H-吲唑-3-YL]苯-1,3-二醇"消息的异常将发生如下:
输入无效'':预期0..9,'。',' e',' E&#39 ;,标识符字符,空格,节点标签,' ['," =〜",IN,STARTS,ENDS,CONTAINS,IS,' ^&#39 ;,' *',' /','%',' +',' - &#39 ;,' =',"<>","!=",'<',&#39 ;>',"< =","> =",AND,XOR,OR,LOAD CSV,START,MATCH,UNWIND,MERGE,CREATE ,SET,DELETE,REMOVE,FOREACH,WITH,RETURN,UNION,&#39 ;;'或输入结束(第1行,第53栏(偏移:52)) "匹配(n1:药物) - [x] - (n2:疾病)返回n1限制25""
我该如何解决这个问题?非常感谢你!
答案 0 :(得分:1)
您实际上有两个不同的查询,它们有不同的问题:
第一个查询由此语句生成:
"MATCH (m:Disease) WHERE m.disease_name =~ '(?i)"+disease+"' RETURN m";
由于您使用单引号作为regexp字符串分隔符,如果disease
值包含单引号,那么这将过早结束正则表达式。您有多种选择,以提高质量列出:
disease
中的所有单引号字符转义(使用前面的反斜杠)。使用双引号作为regexp字符串分隔符(也需要转义字符,但不需要更改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”;
您的第二个查询有一个简单的拼写错误。它最后有一个额外的双引号:
"MATCH (n1:Drug)-[x]-(n2:Disease) RETURN n1 LIMIT 25""
应该是:
"MATCH (n1:Drug)-[x]-(n2:Disease) RETURN n1 LIMIT 25"