Neo4j:cypher

时间:2016-02-09 06:10:43

标签: neo4j cypher

我正致力于一个项目,旨在建立一个系统来检索生物医学信息(例如生物医学实体,如药物,疾病和基因,以及它们之间的关系)。当我尝试使用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""

我该如何解决这个问题?非常感谢你!

1 个答案:

答案 0 :(得分:1)

您实际上有两个不同的查询,它们有不同的问题:

  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”;

  2. 您的第二个查询有一个简单的拼写错误。它最后有一个额外的双引号:

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

    应该是:

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