【问题标题】:cypher distinct is returning duplicate using with parametercypher distinct 使用 with 参数返回重复项
【发布时间】:2018-03-23 08:02:10
【问题描述】:
MATCH (c:someNode)   WHERE  LOWER(c.erpId) contains (LOWER("1")) 
OR  LOWER(c.constructionYear) contains (LOWER("1")) 
OR  LOWER(c.label) contains (LOWER("1"))
OR  LOWER(c.name) contains (LOWER("1")) 
OR  LOWER(c.description) contains (LOWER("1"))with collect(distinct c) as rows, count(c) as total 
    MATCH (c:someNode)-[adtype:OFFICIAL_someNode_ADDRESS]->(ad:anotherObject) 

WHERE toString(ad.streetAddress) contains "1"     
OR toString(ad.postalCity) contains "1" 
with distinct rows+collect( c) as rows, count(c) +total as total
 UNWIND rows AS part

RETURN part order by part.name SKIP 20 Limit 20

当我运行以下密码查询时,它会返回重复的结果。而且它的跳过似乎不起作用。我在做什么呢

【问题讨论】:

    标签: neo4j cypher cypher-3.1


    【解决方案1】:

    当您使用WITH DISTINCT a, b, c(或RETURN DISTINCT a, b, c)时,这仅意味着您希望每个结果记录({a: ..., b: ..., c: ...})是不同的——它不会以任何方式影响任何可能存在的列表的内容abc 的一部分。

    以下是可能对您有用的简化查询。它根本不使用LOWER()TOSTRING() 函数,因为它们看起来是多余的。它也只使用一个MATCH/WHERE 对来查找所有感兴趣的节点。 pattern comprehension 语法用作WHERE 子句的一部分,以获取true 值的非空列表,前提是存在任何感兴趣的anotherObject 节点。请注意,不需要DISTINCT

    MATCH (c:someNode)
    WHERE
      ANY(
        x IN [c.erpId, c.constructionYear, c.label, c.name, c.description]
        WHERE x CONTAINS "1") OR
      [(c)-[:OFFICIAL_someNode_ADDRESS]->(ad:anotherObject)
        WHERE ad.streetAddress CONTAINS "1" OR ad.postalCity CONTAINS "1"
        | true][0]
    RETURN c AS part
    ORDER BY part.name SKIP 20 LIMIT 20;
    

    【讨论】:

    • to lower 添加了使查询不区分大小写
    • 小写“1”不会改变其编码。
    • 是的,这些值并不一定意味着它可以是任何字符串值,因为我是根据一些要求动态生成此查询
    • 您应该将比较值作为参数传递,并保持查询本身不变。这样更快、更安全。此外,您应该传递小写值,这样您的查询就不会一直使用小写函数。
    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 2018-06-28
    • 2021-07-23
    • 2014-06-20
    • 2015-12-28
    • 2016-05-26
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多