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-indexes
和
the-difference-between-legacy-indexing-auto-indexing-and-the-new-indexing-approach
我还不能对它们发表评论并在这里写一个新线程。
在我的数据库中,我有一个遗留索引 'topic' 和标签 'Topic'.
我知道:
- 一个。 pattern MATCH (n:Label) 将扫描节点;
- b。 pattern START (n:Index) 将搜索遗留索引
- c。 auto-index 是一种遗留索引,应该得到与 (b) 相同的结果,但在我的情况下不是
- d。 "good practices".
的 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 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",如自动索引语法)
你能帮忙解释一下吗:
遗留索引和自动索引之间有什么区别,为什么两者之间的结果不一致?
如何将 MATCH 子句与索引而不是标签一起使用?
我想重现全文搜索的结果。
执行全文搜索的语法仅适用于节点的邻居,而不适用于全数据库?比赛 ?开始条款?遗留索引?标签?我很困惑。
自动索引(只有一个)是一个名为 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 p
和MATCH (n:Topic) where n.name = 'DNA' return n
是等价的。两者都会产生相同的查询计划。如果标签 Topic
和 属性 name
上有模式索引(通过 CREATE INDEX ON :Topic(name)
),Cypher 将隐式使用模式索引来查找指定的节点。
目前您不能使用基于架构索引的全文搜索。全文仅在手动/自动索引中可用。
您随 START n=node:topic(...)
提供的所有示例都依赖于手动索引。使它们与图表内容保持同步是您的责任,因此我假设差异是由于图表中的修改不一致造成的,而不是反映对手动索引的更改。
在任何情况下,如果您使用 START n=node:topic(....)
将永远不会使用架构索引。
这个问题在 neo4j-legacy-indexes-and-auto-index-vs-new-label-bases-schema-indexes 和 the-difference-between-legacy-indexing-auto-indexing-and-the-new-indexing-approach
我还不能对它们发表评论并在这里写一个新线程。 在我的数据库中,我有一个遗留索引 'topic' 和标签 'Topic'.
我知道:
- 一个。 pattern MATCH (n:Label) 将扫描节点;
- b。 pattern START (n:Index) 将搜索遗留索引
- c。 auto-index 是一种遗留索引,应该得到与 (b) 相同的结果,但在我的情况下不是
- d。 "good practices". 的 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 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",如自动索引语法)
你能帮忙解释一下吗:
遗留索引和自动索引之间有什么区别,为什么两者之间的结果不一致?
如何将 MATCH 子句与索引而不是标签一起使用? 我想重现全文搜索的结果。
执行全文搜索的语法仅适用于节点的邻居,而不适用于全数据库?比赛 ?开始条款?遗留索引?标签?我很困惑。
自动索引(只有一个)是一个名为 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 p
和MATCH (n:Topic) where n.name = 'DNA' return n
是等价的。两者都会产生相同的查询计划。如果标签 Topic
和 属性 name
上有模式索引(通过 CREATE INDEX ON :Topic(name)
),Cypher 将隐式使用模式索引来查找指定的节点。
目前您不能使用基于架构索引的全文搜索。全文仅在手动/自动索引中可用。
您随 START n=node:topic(...)
提供的所有示例都依赖于手动索引。使它们与图表内容保持同步是您的责任,因此我假设差异是由于图表中的修改不一致造成的,而不是反映对手动索引的更改。
在任何情况下,如果您使用 START n=node:topic(....)
将永远不会使用架构索引。