【问题标题】:CONTAINS with boundary across multiple words in Neo4j包含 Neo4j 中多个单词的边界
【发布时间】:2021-12-10 04:29:53
【问题描述】:

我正在尝试在 neo4j 中使用跨多个单词的边界进行 CONTAINS。有什么建议吗?

等价于:

MATCH (a)-[:REL]->(b)
WHERE b.whole CONTAINS a.part
RETURN a.part, b.whole

会返回:
“彼得”,“彼得·安德鲁·莫里森”
“安德鲁”,“彼得·安德鲁·莫里森”
“莎拉摩根”、“莎拉摩根威尔克森”

不会返回
“皮特”,“彼得·安德鲁·莫里森”
“皮特·安德鲁”、“彼得·安德鲁·莫里森”
“莎拉”、“莎拉摩根威尔克森”

正则表达式是要走的路吗?如果是这样,你如何在正则表达式中添加 a.part ?我试过了

WHERE b.whole=~'.*'+a.part+'.*'

但这会返回错误。

或者我应该将 b.whole 拼接成一个列表并在列表中做 b.part 吗?

WITH b, a, split(b.whole, ' ') as list 
WHERE a.part in list

但这一次只允许一个单词,我需要多个单词匹配......有什么想法吗?
TIA!!!

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    关键字“contains”也适用于字符串中的字符串,不必是整个单词。试试下面这个密码,它会返回 true。

    RETURN "Peter Andrew Morrison" CONTAINS "Pete" 
    true
    

    问题是没有这样的节点“a”,其中 a.part 等于“Pete”。复制下面的密码并在你的 neo4j 中运行它。您将看到 0 行。

    MATCH (a)-[:REL]->(b) 
    WHERE a.part = "Pete" 
    RETURN a
    

    因此,如果 Pete 的节点“a”不存在或/并且未连接到 b,那么您将不会在结果中得到“Pete”、“Peter Andrew Morrison”。

    【讨论】:

    • 感谢您的回复 - 对不起,我的休息时间太晚了。对我来说棘手的部分是当我搜索皮特时让彼得不回来。有没有办法强制 Neo4j “包含”尊重单词边界,这样如果单词搜索是更大单词的一部分,它就不会返回 TRUE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多