我正在使用网络界面和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超出了我的能力。
答案 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