Neo4j自由文本搜索结合关系查询

Neo4j free text search combined with relation query

我看到 Neo4j 有 Indexes to support full-text search。但是我无法在文档中找到有关如何将此功能与常规关系查询一起使用的示例。

比如我有如下结构:(:User)->[:Wrote]->(:Review)->[:Reviewing]->(:Movie)

我想使用全文搜索功能搜索评论,但仅限于特定用户。所以用户 '123' 想搜索他的所有评论,其中包含 'great acting'。因此搜索用户的评论将是 MATCH (:User { id: 123 })-[w]->(review)。在搜索带有 'great' 和 'acting' 的评论时,将是 CALL db.index.fulltext.queryNodes("reviews", "great acting")

我想不通的是如何用AND逻辑将两者结合起来。

编辑
我想我可以做以下事情:

CALL db.index.fulltext.queryNodes("reviews", "great acting") YIELD node as reviews
MATCH (:User { id: 123 })-[w]->(reviews)

问题是,我可能有数百万条带有 "great" 或 "acting" 的评论,而相关用户的评论可能不超过 10 条。听起来效率不是很高。

不知道如何在这种情况下使用全文搜索,但我认为在这种情况下您可以使用带有 CONTAINS 谓词的单个 属性 索引。

如果您搜索节点的单个属性,那么您可以索引那个属性并使用CONTAINS谓词进行搜索。

创建索引:

CREATE INDEX ON :Review(text)

搜索查询:

MATCH (:User{ id: 123 })->[:Wrote]->(review:Review)->[:Reviewing]->(:Movie) 
WHERE review.text CONTAINS 'love'

P.S.:

另一种方法可以是先使用全文搜索来搜索评论节点,然后通过在上述查询中进行匹配来为用户过滤这些评论节点。我怀疑这会带来任何性能改进。

在这种特殊情况下,全文搜索对性能没有帮助,因为这会 select 所有包含 'great acting' 的评论(其中可能有很多)然后您需要筛选属于相关用户的那些。

这比匹配相关用户的评论(应该相对少得多)然后过滤单词 'great acting'.

的性能要差得多

您可以在 WHERE 子句中使用 CONTAINS 关键字来确保 属性 包含给定的子字符串,如 Raj 的回答(尽管区分大小写):

MATCH (:User{ id: 123 })->[:Wrote]->(review:Review)->[:Reviewing]->(:Movie) 
WHERE review.text CONTAINS 'great acting'
...

您也可以在此创建索引,但如果不在此处用于查找而是从用户节点开始,效率会高得多(您可以解释查询以确定使用哪些索引来查找起始节点)。

如果您需要不区分大小写的关键字搜索,您可以为此使用 =~ regex operator,尽管这不是索引支持的。例如:

MATCH (:User{ id: 123 })->[:Wrote]->(review:Review)->[:Reviewing]->(:Movie) 
WHERE review.text =~ '(?i).*great acting.*'
...