Neo4j 自动索引、遗留索引和标签模式:相对于节点的全文搜索的差异

Neo4j auto-index, legacy index and label schema: differences for a relative-to-a-node full-text search

这个问题在 neo4j-legacy-indexes-and-auto-index-vs-new-label-bases-schema-indexesthe-difference-between-legacy-indexing-auto-indexing-and-the-new-indexing-approach

我还不能对它们发表评论并在这里写一个新线程。 在我的数据库中,我有一个遗留索引 'topic' 和标签 'Topic'.

我知道:

我在 a 之间有不一致的结果。和 b。 (见下文),无法弄清楚如何使用 MATCH 的正确语法来搜索标签的索引。

这里有一些例子:

1#

start n=node:topic('name:(keyword1 AND keyword2)') return n

6 行,3 毫秒

start n=node:node_auto_index('name:(keyword1 AND keyword2)') return n;

0 行

MATCH (n:Topic) where n.name =~ '(?i).*keyword1*.AND.*keyword2*.' return n;

0 行,10K 毫秒

2#

start n=node:topic('name:(keyword1)') return n

212 行,122 毫秒[包含子字符串关键字 1 的所有连贯结果]

start n=node:node_auto_index('name:(keyword1)') return n

0 行

MATCH (n:Topic) where n.name =~ '(?i).*keyword1*.'return n

835 行,8K ms [结果也不连贯,包含子字符串 eyword]

MATCH (n:Topic) where n.name =~ 'keyword1' return n;

1 行,>6K 毫秒[完全匹配]

MATCH (n:topic) where n.name =~ 'keyword1' return n;

没有结果(这里我用的是索引'topic'而不是标签'Topic'!)

MATCH (node:topic) where node.name =~ 'keyword1' return node;

无结果(尝试直接使用节点 "object",如自动索引语法)

你能帮忙解释一下吗:

自动索引(只有一个)是一个名为 node_auto_index 的手动(也称为遗留)索引。这个特殊的索引通过连接到事务处理来跟踪图形的变化。因此,如果您将 name 声明为配置中节点的自动索引的一部分,则对名称为 属性 的节点的任何更改都会反映到该索引中。

请注意,当您添加例如用于自动索引的新 属性。

进一步注意,手动或自动索引完全独立于标签。

查询手动或自动索引的唯一方法是使用 START 子句:

START n=node:<indexName>(<lucene query expression>) // index query
START n=node:<indexName>(key='<value>') // exact index lookup

架构索引完全不同,并在适当的时候在MATCH中使用。

一个blog post of mine涵盖了neo4j的所有索引能力。

通常,您在图形数据库中使用索引来标识遍历的起点。在图表中获得引用后,您只需遵循关系,不再进行索引查找。

有关全文索引,请参阅 another blog post

根据以下评论更新

事实上MATCH (p:Topic {name: 'DNA'}) RETURN pMATCH (n:Topic) where n.name = 'DNA' return n是等价的。两者都会产生相同的查询计划。如果标签 Topic 和 属性 name 上有模式索引(通过 CREATE INDEX ON :Topic(name)),Cypher 将隐式使用模式索引来查找指定的节点。

目前您不能使用基于架构索引的全文搜索。全文仅在手动/自动索引中可用。

您随 START n=node:topic(...) 提供的所有示例都依赖于手动索引。使它们与图表内容保持同步是您的责任,因此我假设差异是由于图表中的修改不一致造成的,而不是反映对手动索引的更改。

在任何情况下,如果您使用 START n=node:topic(....) 将永远不会使用架构索引。