这个问题在 neo4j-legacy-indexes-and-auto-index-vs-new-label-bases-schema-indexes 和 the-difference-between-legacy-indexing-auto-indexing-and-the-new-indexing-approach
我还不能对它们发表评论并在这里写一个新线程。 在我的数据库中,我有一个遗留索引“主题”和标签“主题”。
我知道:
- 一个。 pattern MATCH (n:Label) 将扫描节点;
- b。 pattern START (n:Index) 将搜索遗留索引
- c。 auto-index 是一种遗留索引,应该给出与 (b) 相同的结果,但在我的情况下不是
- d。对于“良好做法”,START 子句应替换为 MATCH。
我在 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 毫秒 [结果也不连贯,包含子字符串 关键字]
MATCH (n:Topic) where n.name =~ 'keyword1' return n;
1 行,>6K 毫秒 [完全匹配]
MATCH (n:topic) where n.name =~ 'keyword1' return n;
没有结果(这里我使用的是索引“主题”而不是标签“主题”!)
MATCH (node:topic) where node.name =~ 'keyword1' return node;
无结果(尝试直接使用节点“object”,如自动索引语法)
你能帮忙解释一下吗:
遗留索引和自动索引之间有什么区别,为什么两者之间的结果不一致?
如何将 MATCH 子句与索引而不是标签一起使用? 我想重现全文搜索的结果。
执行全文搜索的哪种语法仅适用于节点的邻居,而不适用于全数据库?比赛 ?开始条款?遗留索引?标签?我很困惑。
最佳答案
自动索引(只有一个)是一个名为 node_auto_index
的手动(也称为遗留)索引。这个特殊的索引通过连接到事务处理来跟踪图形的变化。因此,如果您将 name
声明为配置中节点的自动索引的一部分,则对具有 name 属性的节点的任何更改都会反射(reflect)到该索引。
请注意,当您添加例如用于自动索引的新属性。
请进一步注意,手动或自动索引完全独立于标签。
查询手动或自动索引的唯一方法是使用 START 子句:
START n=node:<indexName>(<lucene query expression>) // index query
START n=node:<indexName>(key='<value>') // exact index lookup
模式索引完全不同,并在适当的时候用在 MATCH
中。
A blog post of mine涵盖了 neo4j 的所有索引功能。
通常,您在图形数据库中使用索引来标识遍历的起点。在图表中获得引用后,您只需遵循关系即可,不再进行索引查找。
有关全文索引,请参阅 another blog post .
根据以下评论更新
事实上 MATCH (p:Topic {name: 'DNA'}) RETURN p
和 MATCH (n:Topic) where n.name = 'DNA' return n
两者是等价的。两者都会产生相同的查询计划。如果标签 Topic
和属性 name
上有模式索引(通过 CREATE INDEX ON :Topic(name)
),Cypher 将隐式使用该模式索引以查找指定的节点。
目前您不能使用基于模式索引的全文搜索。全文仅在手动/自动索引中可用。
您随 START n=node:topic(...)
提供的所有示例都依赖于手动索引。您有责任使它们与您的图表内容保持同步,因此我假设差异是由于图表中的不一致修改造成的,而不是反射(reflect)对手动索引的更改。
在任何情况下,如果您使用 START n=node:topic(....)
将永远不会使用架构索引。
关于Neo4j 自动索引、遗留索引和标签模式 : differences for a relative-to-a-node full-text search,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31770466/