我有大量节点,其属性text
包含字符串。
我想找到文本包含给定字符串的所有节点(完全匹配)。这可以使用CONTAINS
运算符完成。
MATCH (n)
WHERE n.text CONTAINS 'keyword'
RETURN n
编辑:我正在寻找所有节点n,其中n.text包含子字符串'关键字'。例如。 n.text = 'This is a keyword'
。
为了加快这个速度,我想为每个单词创建一个索引。这是否可以使用新的Schema Indexes?
(或者这可以使用legacy index并将每个节点添加到此索引但我更喜欢使用模式索引来完成
答案 0 :(得分:3)
绝对。鉴于您正在寻找完全匹配,您可以使用模式索引。从您的问题判断,您可能知道这一点,但要创建索引,您需要为节点分配一个标签,然后在该标签上创建索引。
CREATE INDEX ON :MyLabel(text)
然后在查询时,密码执行索引将自动使用此索引和以下查询
MATCH (n:MyLabel { text : 'keyword' })
RETURN n
这将使用模式索引来查找标记为MyLabel
的节点和具有值text
的属性keyword
。请注意,这与属性的完整值完全匹配。
要强制Neo4j使用特定索引,您可以使用index hints
MATCH (n:MyLabel)
USING INDEX n:MyLabel(text)
WHERE n.text = 'keyword'
RETURN n
修改强>
在重新阅读您的问题时,我认为您实际上并不是在寻找完全匹配,但实际上希望在keyword
参数 text
内完全匹配领域。如果是,那么......不,你还不能使用模式索引。在Neo4j手册中引用Use index with STARTS WITH:
目前无法使用索引解决类似的运算符ENDS WITH和CONTAINS。
答案 1 :(得分:2)
如果我正确理解您的问题,遗留索引将完全符合您的目标。如果您不想为您创建/删除/更新的每个节点维护索引,则可以使用自动索引(http://jexp.de/blog/2014/03/full-text-indexing-fts-in-neo4j-2-0/)。
如果您希望仅使用架构索引,则另一种方法是将每个关键字存储为单独的节点。然后,您可以使用模式索引查找相关的关键字节点,然后映射到它们所在的节点。只是一个想法。