Neo4j自动索引,遗留索引和标签架构:相对于节点的全文搜索的差异

时间:2015-08-02 09:26:40

标签: neo4j lucene full-text-search label full-text-indexing

这个问题部分回答了 neo4j-legacy-indexes-and-auto-index-vs-new-label-bases-schema-indexesthe-difference-between-legacy-indexing-auto-indexing-and-the-new-indexing-approach

我还不能对它们发表评论并在这里写一个新主题。 在我的数据库中,我有一个遗留索引'主题'并标记'主题'。

我知道:

  • 一个。 pattern MATCH(n:Label)将扫描节点;
  • 湾模式START(n:索引)将搜索旧索引
  • ℃。自动索引是一种遗留索引,应该像(b)那样给出相同的结果,但在我的情况下它不是
  • d。对于"良好做法"。
  • ,应将START条款替换为MATCH

我之间的结果不一致。和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 ms

2#

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

212行,122 ms [所有相关结果包含substring keyword1]

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 ms [完全匹配]

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

没有结果(这里我使用的是索引'主题'不是标签'主题'!)

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

没有结果(尝试直接使用节点"对象"如在自动索引语法中那样)

你能帮忙解释一下:

  • 传统索引和自动索引之间的差异以及为什么两者之间的结果不一致?

  • 如何将MATCH子句与索引而不是标签一起使用? 我想重现全文搜索的结果。

  • 使用哪种语法进行全文搜索只应用于节点的邻居,而不是全db?比赛 ? START条款?遗产索引?标签?我很困惑。

1 个答案:

答案 0 :(得分:3)

自动索引(只有一个)是名为node_auto_index的手动(又称遗留)索引。此特殊索引通过挂钩到事务处理来跟踪对图形的更改。因此,如果您将name声明为配置中节点的自动索引的一部分,则对具有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和属性nameCREATE INDEX ON :Topic(name))上存在架构索引,则Cypher将隐式使用架构索引来查找指定的节点。

目前您无法使用基于架构索引的全文搜索。全文仅适用于手动/自动索引。

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

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