gpt4 book ai didi

neo4j - Cypher 查询以在所有属性中搜索短语

转载 作者:行者123 更新时间:2023-12-04 19:01:11 36 4
gpt4 key购买 nike

我在尝试在我的 Neo4j 中实现搜索时遇到了一个有趣的问题。 D B。我想在任何节点的属性中搜索某个短语(也允许部分匹配)。这必须是通用的并且适用于所有节点类型和标签,因此我无法搜索预定义的属性列表。

为了理解这个问题,考虑一下 Neo4j 浏览器中捆绑的著名电影数据库教程( :play movie graph ):假设我想搜索标签为 Movie 的节点。具有以“The”开头的属性。我的第一个想法是:

match (m:Movie)
where (any(prop in keys(m) where m[prop] starts with "The"))
return m

这当然会引发错误,因为其中一个属性是数字而不是字符串。使用 toString不会帮助我,因为在我的数据库中,一些属性是 bool 值,而 bool 值不响应 toString .

我的下一个尝试是使用正则表达式,它也更适合搜索,因为我可以使它不区分大小写,并且总体上更健壮。所以我这样做了:
match (m:Movie)
where (any(prop in keys(m) where m[prop] =~ "(?i)The .*"))
return m

它奏效了!我得到了所有标题或标语以“The”开头的电影。有很多的欣喜。

但现在是棘手的部分。我的搜索还需要提供对搜索的否定,即所有没有以“The”开头的属性的电影。我显然尝试过:
match (m:Movie)
where NOT (any(prop in keys(m) where m[prop] =~ "(?i)The .*"))
return m

但是这个查询返回了一个空响应。没有错误,只是没有结果。

在尝试隔离问题时,我意识到查询在以下情况下确实有效:
  • 如果节点只有字符串属性(没有数字或 bool 值)。
  • 如果我使用完全匹配而不是正则表达式( where NOT(any(prop in keys(m) where m[prop] = "Hoffa")) )。
  • 如果我搜索特定属性 ( where NOT(any(prop in ['title','tagline'] where m[prop] =~ "(?i)The .*")) )

  • 似乎只有 not的组合, any , 并且正则表达式破坏了查询,我无法找出为什么会发生这种情况。

    最佳答案

    至少在 neo4j 3.0 中,STARTS WITH语法似乎更适合您的场景(但区分大小写):

    MATCH (m:Movie)
    WHERE NONE(prop in keys(m) where TOSTRING(m[prop]) STARTS WITH "The ")
    RETURN m;

    关于neo4j - Cypher 查询以在所有属性中搜索短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37328426/

    36 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com