使用Neo4j Cypher正则表达式中的反向引用来获取子字符串位置的函数

时间:2014-08-13 23:16:47

标签: neo4j cypher

我正在使用网络界面和Neo4j社区2.1.3。

是否有Cypher函数或函数组合给出字符串中子字符串的位置或使用其位置作为SET子句的起始点,类似于Google Spreadsheets中的FIND或SEARCH或substring-before()和XPATH中的substring-after()?类似的东西:

MATCH (p)
WHERE p.name=~"^.*?\\, .*?$"
SET p.lastName=LEFT(p.name,FIND(p.name,", ")), p.firstName=RIGHT(p.name,FIND(p.name,",")+1)
RETURN p ;

FIND()函数将返回子字符串的位置(在本例中:逗号加上单个空格),因此LEFT和RIGHT函数可用于提取部分字符串。像XPATH substring-before()和substring-after()之类的东西在一个函数中完成同样的事情。 Cypher字符串函数SUBSTRING,LEFT,RIGHT仅在没有这些附加功能的情况下使用有限 - 除非我只是遗漏了一些东西。

沿着这些方面(字符串操作),有没有办法使用反向参考Cypher正则表达式WHERE匹配?我们可以使用组进行匹配,但我无法弄清楚如何在SET子句中使用\ 1或$ 1重用这些组。使用正则表达式组和某种反向引用可以使上述代码更简单:

MATCH (p)
WHERE p.name=~"^(.*?)\\, (.*?)$"
SET p.lastName=\1, p.firstName=\2
RETURN p ;

这些事情可能吗?我无法找到文档或示例。我已经看过Regx4Neo plugin了,但此时命令shell超出了我的能力。

1 个答案:

答案 0 :(得分:2)

如果你的例子是如此做作以至于无关紧要,我很抱歉,但你可以分开","然后SET属性等于分割产生的不同元素。因此,使用以下示例数据:

CREATE (:Person {name:'White, Nicole'}),
       (:Person {name:'Bastani, Kenny'}),
       (:Person {name:'Hunger, Michael'})

我们可以获得名字和姓氏,并将它们设置为属性:

MATCH (p:Person)
WITH p, SPLIT(p.name, ", ") AS names
SET p.firstName = names[1],
    p.lastName = names[0]

结果:

MATCH (p:Person)
RETURN p.firstName, p.lastName

p.firstName   p.lastName
Nicole        White
Kenny         Bastani
Michael       Hunger