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

函数使用Neo4j Cypher正则表达式中的反向引用获取子字符串的位置,neo4j,cypher,Neo4j,Cypher,我正在使用web界面和Neo4j社区2.1.3 是否有一个Cypher函数或函数组合可以给出子字符串在字符串中的位置,或将其位置用作SET子句的起点,类似于在Google电子表格中查找或搜索,或在XPATH中查找或搜索substring-before()和substring-after()?比如: MATCH (p) WHERE p.name=~"^.*?\\, .*?$" SET p.lastName=LEFT(p.name,FIND(p.name,", ")), p.firstName=RI

我正在使用web界面和Neo4j社区2.1.3

是否有一个Cypher函数或函数组合可以给出子字符串在字符串中的位置,或将其位置用作SET子句的起点,类似于在Google电子表格中查找或搜索,或在XPATH中查找或搜索substring-before()和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子字符串-before()和子字符串-after()在一个函数中完成了相同的任务。Cypher字符串函数SUBSTRING,LEFT,RIGHT在没有额外功能的情况下只有有限的用途-除非我遗漏了什么

沿着这些思路(字符串操作),有没有一种方法可以使用对匹配的Cypher正则表达式的反向引用?我们可以使用组进行匹配,但我不知道如何在SET子句中使用\1或$1重用这些组。使用正则表达式组和某种反向引用可以简化上述代码:

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

这些事情可能吗?我找不到文档或示例。我已经看到了,但是命令shell在这一点上超出了我的能力。

如果您的示例过于做作,以至于与此无关,我很抱歉,但是您可以在“,”上拆分,然后
属性设置为与拆分产生的不同元素相等。因此,使用以下示例数据:

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

是的,我的例子过于简单了——我并没有试图用固定字符串“,”来解决这个特定的问题。将分割函数的结果放入数组中可以很好地分配结果字符串,但我确实需要能够使用regex处理分割函数的输入。这与我提到的SUBSTRING、LEFT和RIGHT函数是一样的:只有当它们需要精确的字符串和预先设置的位置作为输入时,它们才会受到限制。对我来说,这是处理字符串的一般需要,而不仅仅是我试图解决的一个实例。真正的问题是如何使用正则表达式来输入Cypher字符串函数,包括SPLIT?假设你有一个关于中国领导人埋葬地点的数据库,标题图片的格式是“王健(847-918年7月11日)被埋葬在成都”。你如何从标题中删除插入的日期,并留下其余的?在其他语言中,这是一个简单的regex+反向引用解决方案。像这样的二进制字符串操作是如何在Cypher中处理的?也许这是在客户端语言的预处理中应该做的事情?对于您的具体问题,可能在“(“and”)上拆分Michael指出了我需要的答案:在密码函数中没有模式匹配或反向引用。我的例子很不幸:两者都包含文字。在其他地方,我可以更轻松地使用正则表达式。既然WHERE子句已经支持正则表达式,为什么不将其扩展到函数呢?这将是一个强大的功能。我只使用Neo4j web界面。从Neo4j中导出数据以进行处理,然后重新导入以进行测试或重构,这是愚蠢的。Neo4j的优势之一应该是能够重构数据,而不必担心RDBMs会发生变化!