【问题标题】:Neo4j auto-index, legacy index and label schema: differences for a relative-to-a-node full-text searchNeo4j 自动索引、遗留索引和标签模式:相对于节点全文搜索的差异
【发布时间】:2015-08-02 09:26:40
【问题描述】:

这个问题在 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: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 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 子句与索引而不是标签一起使用? 我想重现全文搜索的结果。

  • 哪种语法只应用于节点的邻居而不是完整数据库?匹配 ? START 子句?遗留索引?标签?我很困惑。

【问题讨论】:

  • 你的正则表达式语法也是错误的,这应该可以工作 '(?i).*(keyword1|keyword2){2}.*'
  • :Topic 是一个标签,它与手动/旧索引完全不同,它们根本不可交换。
  • 在正则表达式中:零个或多个是.* 而不是*. !!!所以这个(?i).*keyword1*.' 必须是 (?i).*keyword1.*'

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


【解决方案1】:

自动索引(只有一个)是手动(也称为旧版)索引,名称为 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(....),将永远不会使用架构索引。

【讨论】:

  • 谢谢@Stefan,但是:语法:MATCH (p:Topic {name: 'DNA'}) RETURN p;MATCH (n:Topic) where n.name = 'DNA' return n; 有什么区别?以及如何使用架构索引查找全文搜索?例如,如何重现与 start n=node:topic('name:(DNA*)') return n;start n=node:topic('name:(DNA* AND gene*)') return n 相同的结果?为什么MATCH (node:Topic) where node.name =~ "DNA*" return node; 产生的结果与start n=node:topic('name:(DNA)') return n 不同,为什么尽管设置了CREATE INDEX ON :Topic(name); 却需要更长的时间?
  • 啊哈!如果不支持全文,您能否提供一些最佳使用模式索引的示例?在这种情况下,开始图遍历的最佳适用性是否只是数字? (在 id 上精确匹配)。在您的博客中,我读到“当前架构索引不能在多个属性上生成,但您可以为同一个标签创建多个索引”:这是否意味着我可以在 legacy 和 schema-index 上结合全文?例如。对带有模式索引“Artist”的传统索引匹配字符串模式“Leonardo”进行全文搜索?您能否提供一个 cypher 语法示例?
  • 结合模式索引和手动索引是一种反模式。将模式索引视为用于精确查找的大型哈希映射。对于其他任何事情,请使用手动/自动索引。附带说明:Neo4j 2.3 将有一个支持 LIKE 的架构索引,允许进行前缀搜索:MATCH (n:Person) where n.name like "Jo%" RETURN n 将通过索引找到 John 和 Joanne。
  • 如果支持全文索引,本机使用哪些标准来对结果进行排序以获得与关键字的最佳匹配?以及如何与它进行交互暗号?我开了另一个帖子,你可能想在这里投稿:[stackoverflow.com/q/31862761/305883]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多