【问题标题】:neo4j cypher left padding String in Where ClauseNeo4j 密码在 Where 子句中留下填充字符串
【发布时间】:2016-04-29 08:28:56
【问题描述】:

我的节点中有一个字符串属性,其中字符串的长度不固定。 现在我必须通过这个属性搜索正确的节点,但我从另一个系统得到一个固定长度的值。例如,我的节点具有值“0123”,但我得到信息“000123”进行搜索。

我需要一个函数,比如用零填充的左填充,以及在 Where 子句中的这个

MATCH (a:LABEL) where leftPad(a.property, 6, '0') = '000123' return a 限制 1 个

这样的事情是否可能具有良好的性能?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    你可以这样做:

    MATCH (a:LABEL)
    WHERE SUBSTRING('00000', 0, SIZE(a.property)) + a.property = '000123'
    RETURN a
    LIMIT 1;
    

    或者,如果所有字符都是数字,那么你可以这样做:

    MATCH (a:LABEL)
    WHERE TOINT(a.property) = TOINT('000123')
    RETURN a
    LIMIT 1;
    

    但是,如果您可以首先将property 值存储为一个整数,然后将其与一个整数进行比较,那就更好了,这将是最快的。这可能很容易做到,具体取决于您的情况。

    MATCH (a:LABEL)
    WHERE a.property = 000123
    RETURN a
    LIMIT 1;
    

    【讨论】:

    • substring("00000", length(s)) 看起来比substring("00000", 0, 5-length(s)) 更高效:)
    • 我还刚刚注意到,字符串上的length() 将来可能会被弃用,而使用size()recommended
    【解决方案2】:

    试试reduce:

    MATCH (a:LABEL) 
    WHERE REDUCE(lp='', n in RANGE(0,5-size(a.name)) | lp+'0')+a. a.property = '000123'
    RETURN a
    

    或者用regular expression试试:

    MATCH (a:LABEL)
    WHERE a.property =~ '(0){0,3}123'
    RETURN a
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 2020-05-25
      相关资源
      最近更新 更多