当前位置: 首页 > 知识库问答 >
问题:

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

景宏盛
2023-03-14

neo4j旧索引和自动索引与新标签基模式索引以及旧索引自动索引和新索引方法之间的差异部分回答了这个问题

我还不能评论他们,在这里写一个新的帖子。在我的数据库中,我有一个遗留索引“topic”和标签“topic”。

我知道:

  • 模式匹配(n: Label)将扫描节点;
  • b.模式START(n: Index)将搜索遗留索引
  • c.自动索引是一种遗留索引,应该给我与(b)相同的结果,但在我的情况下没有
  • d.对于"良好做法",START子句应替换为MATCH。

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

这里有一些例子:

1#

start n=node:topic('name:(关键字1和关键字2)')返回n

6行,3ms

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行,10Kms

2#

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

212行,122 ms[所有包含子串keyword1的连贯结果]

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

0行

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

835行,8K毫秒[结果也不一致,包含子字符串eyword]

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

一排,

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

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

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

没有结果(尝试直接使用节点对象,如自动索引语法)

你能帮我解释一下吗:

>

  • 遗留索引和自动索引之间有什么区别,为什么两者之间的结果不一致?

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

    哪种语法进行全文搜索仅应用于节点的邻居,而不是完整数据库?匹配?START条款?遗产索引标签?我很困惑。

  • 共有1个答案

    令狐嘉运
    2023-03-14

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

    请注意,当您为自动索引添加新属性时,自动索引不会自动填充到现有数据集上。

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

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

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

    模式索引是完全不同的,在适当的情况下用于MATCH

    我的一篇博客文章涵盖了neo4j的所有索引功能。

    通常,在图形数据库中使用索引来标识遍历的起点。一旦在图中有了一个引用,就只需遵循关系,不再进行索引查找。

    有关全文索引,请参阅另一篇博客文章。

    实际上MATCH(p:Topic{name:'DNA'})返回pMATCH(n:Topic),其中n.name='DNA'返回n都是等价的。两者都会产生相同的查询计划。如果标签Topic和属性name(通过CREATE index on:Topic(name))上有架构索引,Cypher将隐式使用架构索引查找指定节点。

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

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

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

     类似资料:
    • 我正在从SDN3迁移到SDN4,从NEO4J2.3迁移到3.0。1. 我有以下搜索密码查询: 在我的测试中,Param等于以下Lucene查询: 就是现在 返回 但在SDN 3和Neo4j 2.3上运行良好,并返回节点。 这是我的Neo4jTestConfig: 我的配置可能有什么问题?如何使其在SDN 4上工作? 更新 此外,我发现以下答案无法使用InProcessServer()SDN 4配置

    • 我正在使用node.js连接到neo4j数据库。每当我必须为一个节点设置索引时,我都会通过转到neo4j浏览器(localhost:7474)来手动完成。 我构建了自己的nodejs适配器来连接到neo4j,因此目前我只能访问密码查询。要创建索引,我只能访问cypher或浏览器(7474)。那么创建自动全文索引的正确方法是什么,最好是从浏览器本身创建?我如何使用密码访问它(或者我必须访问它?neo

    • 我正在使用: neo4j 2.0。1 我有一个具有属性名称的节点人员,我想用Lucene语法搜索该属性。我在我的存储库中使用findByNamelike方法,它非常适合像value*或*value或*etc这样的查询。 但是我需要这样的查询{A*TO D*}。我发现了一个弃用的方法findAllByQuery(名称,查询),用这个方法我可以实现我的需求。 > 我还注意到,如果我从cypher创建节

    • 使用Neo4j 2.1。4和SDN 3.2。0.1释放 我有一个图,它将节点与具有关联UUID的关系连接起来。外部系统使用UUID作为标识关系的源和目标的手段。在SpringDataNeo4j(SDN)中,我们有一个类,它有一个、和一个字符串字段。字段是,Neo4j中的结果模式定义显示为 但是,对数据运行密码查询,例如。 对数据库进行全面扫描,需要很长时间 如果我试图通过运行来使用索引 我明白了

    • 我从这里的文档和帖子中了解到,在neo4j中为节点属性启用自动索引后,必须为每个节点重新设置属性,以将属性添加到索引中。 Neo4j 1.9版。M05 使用DrWHO数据库,此groovy代码旨在通过设置属性将Dr字符添加到自动索引字符属性中。此代码不起作用。运行后自动节点索引为空 你能看出我做错了什么吗?

    • 我的Neo4J实例突然停止工作,我想我的驱动器因为一些不相关的日志文件而耗尽了空间。无论如何,现在我不能启动Neo4J,它开始了,一次又一次。如果我检查数据库的一致性,我会得到以下消息。(在版本3.3.5或3.4.1上都不起作用) 警告:标签索引未正确关闭,需要重建。标签索引:neostore。标签可以存储。db WARN:索引未正确关闭,需要重建。索引[IndexRule[id=1,描述符=In