使用密码进行模糊搜索

时间:2013-08-02 10:54:58

标签: neo4j cypher

我为具有FirstName,LastName属性的用户提供节点。现在我想从两个站点的两个属性中搜索一些值。我得解释一下。

FirstName  LastName
---------  --------
Manish     Pal
Pal        Dharmesh
Rajpal     Yadav
sharma     shreepal

现在我想搜索哪个节点的名字或姓氏包含'pal'。 我写过这样的查询。

START users=node(*) 
WHERE (users.FirstName =~ '(?i)pal.*' OR users.LastName =~ '(?i)pal.*') 
RETURN users;

它只给我2个节点,但我希望所有节点都包含'pal'

如果我这样尝试

START users=node(*) 
WHERE (users.FirstName =~ '(?i)*.pal.*' OR users.LastName =~ '(?i)*.pal.*') 
RETURN users;

它给了我以下错误。

“PatternSyntaxException”

在索引4附近悬挂元字符''(?i) .ant。 ^ *

我已将示例here设置为您的准备参考。

感谢。

1 个答案:

答案 0 :(得分:6)

第二个查询包含无效的正则表达式语法。我想你的意思是:

START users=node(*) 
WHERE (users.FirstName =~ '(?i).*pal.*' OR users.LastName =~ '(?i).*pal.*') 
RETURN users

请注意帖子中查询的不同之处:

  • '(?i)*.pal.*'在您的帖子中,
  • 上述查询中的
  • '(?i).*pal.*'

星号*表示我之前的表达式[星号]可能会出现任意次数,包括零。但(?i)不是正则表达式,只是一个忽略实际表达式的修饰符。我想你的意思是.*。正则表达式.匹配任何字符,星号允许任何字符出现任意次数。

因此,'(?i).*pal.*'说: [忽略大小写]<任意数字的任意字符><确切的字符序列:“pal”><任意数字的任意字符>

以上查询为我返回了四个结果:

users.FirstName  | users.LastName
---------------------------------
sharma           | shreepal
Rajpal           | Yadav
Pal              | Dharmesh     
Manish           | Pal

如果我理解你的话,那就是你想要的。