neo4j使用详解(十五、索引之语义索引<全文索引>——最全参考)

2024-04-11 16:28

本文主要是介绍neo4j使用详解(十五、索引之语义索引<全文索引>——最全参考),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请添加图片描述


Neo4j系列导航:
neo4j安装及简单实践
cypher语法基础
cypher插入语法
cypher插入语法
cypher查询语法
cypher通用语法
cypher函数语法
neo4j索引及调优


与搜索性能索引不同,语义索引捕获数据库中数据的语义或上下文。这是通过返回近似分数来完成的,该近似分数指示查询字符串与数据库中的数据之间的相似性。
Neo4j 中有两个可用的语义索引:

  • Full-text indexes(全文索引): 支持在STRING属性的内容中进行搜索,并支持查询字符串与存储在数据库中的STRING值之间的相似性比较

  • Vector indexes(向量索引): 通过将节点或属性表示为多维空间中的向量,支持相似性搜索复杂的分析查询

与搜索性能索引不同,语义索引不会被Cypher®规划器自动使用。要使用语义索引,必须用特定的过程显式地调用它们。

1.语义索引简介

全文索引用于按STRING属性为节点和关系建立索引。

  • 与范围索引和文本索引不同,全文索引只能执行有限的STRING匹配(精确匹配、前缀匹配、子字符串匹配或后缀匹配),
    全文索引在任何给定的STRING属性中存储单个单词。这意味着全文索引可用 于在STRING属性的内容内进行匹配。
  • 全文索引还返回给定查询字符串与存储在数据库中的string值之间的接近度评分,从而使它们能够在语义上解释数据。
  • 全文索引由Apache Lucene 索引和搜索库提供支持。

2.示例图数据

创建图谱:

CREATE (nilsE:Employee {name: "Nils-Erik Karlsson", position: "Engineer", team: "Kernel", peerReviews: ['Nils-Erik is difficult to work with.', 'Nils-Erik is often late for work.']}),
(lisa:Manager {name: "Lisa Danielsson", position: "Engineering manager"}),
(nils:Employee {name: "Nils Johansson", position: "Engineer", team: "Operations"}),
(maya:Employee {name: "Maya Tanaka", position: "Senior Engineer", team:"Operations"}),
(lisa)-[:REVIEWED {message: "Nils-Erik is reportedly difficult to work with."}]->(nilsE),
(maya)-[:EMAILED {message: "I have booked a team meeting tomorrow."}]->(nils)

在这里插入图片描述

3.创建全文索引

3.1.创建语法

创建命令: CREATE FULLTEXT INDEX index_name 名称未指定则随机分配

  • CREATE FULLTEXT INDEX命令可以是幂等的
  • 从Neo4j 5.16开始,索引名也可以作为参数给出,CREATE FULLTEXT index $name FOR…
  • 创建全文索引需要CREATE INDEX权限
  • 在创建全文索引时,需要指定它应该应用的标签/关系类型和属性名称。
    示例一:
    下面的语句为每个带有Employee或Manager标签的节点的name和team属性创建一个名为namesAndTeams的全文索引:
// 在节点标签和属性组合上创建全文索引
CREATE FULLTEXT INDEX namesAndTeams FOR (n:Employee|Manager) ON EACH [n.name, n.team]

这个查询突出了全文索引和搜索性能索引之间的两个关键区别:

  • 全文索引可以应用于多个节点标签。
  • 全文索引可以应用于多个属性,但与复合搜索性能索引不同,全文索引存储至少具有一个索引标签或关系类型以及至少一个索引属性的实体。

类似地,虽然关系只能有一种类型,但全文索引可以存储多种关系类型。在这种情况下,将包括匹配至少一个关系类型和至少一个索引属性的所有类型。

示例二:
下面的语句在message属性上为关系类型review和email创建了一个名为communications的全文索引:

// 在关系类型和属性组合上创建全文索引
CREATE FULLTEXT INDEX communications FOR ()-[r:REVIEWED|EMAILED]-() ON EACH [r.message]

3.2.标记和分析器

全文索引将单个单词存储在STRING属性中。这是通过tokenizer实现的,它将字符流分解为单个标记(通常是单个单词)。如何对
STRING进行标记 是由配置全文索引的分析器决定的。默认分析器(standard-no-stop-words)分析索引值和查询字符串。

停止词是一种语言中的常用词,可以在信息检索任务中过滤掉,因为它们被认为在确定字符串的含义时用处不大。这些词通常很短,经常在各种上下文中使用。
例如, Lucene的英语分析器中包含以下停止词:“a”、“an”、“and”、“are”、“as”、“at”、“be”、“but”等等。
删除停止字有助于减少存储数据的大小,从而提高数据检索的效率。

  • 在某些情况下,对索引值和查询字符串使用不同的分析器更为合适。所有可用分析器的完整列表包含在db.index.fulltext.listAvailableAnalyzers
    过程的结果中。
  • Neo4j还支持使用自定义分析程序。

3.3.配置设置

CREATE FULLTEXT INDEX命令接受一个可选的OPTIONS子句,其中可以指定indexConfig
示例:
下面的语句使用标签为 Employee或Manager的节点的参数创建一个全文索引。Neo4j 5.16中引入了使用参数创建和删除索引。

{"name": "peerReviews"
}

使用OPTIONS创建全文索引:

CREATE FULLTEXT INDEX $name FOR (n:Employee|Manager) ON EACH [n.peerReviews]
OPTIONS {indexConfig: {`fulltext.analyzer`: 'english', //@1`fulltext.eventually_consistent`: true //@2}
}
  1. fulltext.analyzer分析器设置可用于配置特定于索引的分析器。在本例中,它被设置为英语分析器。fulltext.analyzer
    可以使用db.index.fulltext.listAvailableAnalyzers过程列出分析器设置。
  2. fulltext.eventually_consistent设置,如果设置为true,将使索引处于最终一致的更新模式。这意味着更新将“尽快”在后台线程
    中应用,而不是在事务提交期间,这对其他索引来说是正确的。
    有关如何配置全文索引的更多信息,请参见《操作手册——支持全文搜索的索引》

4.查询全文索引

4.1.查询语法

  • db.index.fulltext.queryNodes()
  • db.index.fulltext.queryRelationships()

与其他搜索性能索引不同,全文索引不会被Cypher®查询规划器自动使用。要访问全文索引,必须使用上述过程显式地调用它们。

  • 示例一:

    使用db.index.fulltext.queryNodes在前面创建的全文索引namesAndTeams中查找nils:

    // 查询节点属性的全文索引
    CALL db.index.fulltext.queryNodes("namesAndTeams", "nils") YIELD node, score
    RETURN node.name, score
    

    结果:

    node.namescore
    “Nils Johansson”0.3300700783729553
    “Nils-Erik Karlsson”0.27725890278816223

    分数列表示索引认为条目与给定查询字符串匹配的程度。因此,除了任何精确匹配之外,全文索引还返回与给定查询字符串的近似
    匹配。这是可能的,因为索引的属性值和对索引的查询都是通过分析器处理的,这样索引就可以找到与所提供的STRING不完全匹
    配的数据实体

    分数结果总是按分数降序返回,其中最匹配的结果条目放在前面。


  • 示例二:
    这个查询使用db.index.fulltext.queryRelationships来查询前面创建的包含“meeting”的communications全文索引:

    // 查询关系属性的全文索引
    CALL db.index.fulltext.queryRelationships("communications", "meeting") YIELD relationship, score
    RETURN type(relationship), relationship.message, score
    

    结果:

    type(relationship)relationship.messagescore
    “EMAILED”“I have booked a team meeting tomorrow.”0.3239005506038666
  • 示例三:
    为了只获得精确匹配,引用你正在搜索的字符串:

    // 查询全文索引以获得精确匹配
    CALL db.index.fulltext.queryNodes("namesAndTeams", '"Nils-Erik"') YIELD node, score
    RETURN node.name, score
    

    结果:

    node.namescore
    “Nils-Erik Karlsson”0.7588480710983276
  • 示例四:
    查询字符串也支持使用Lucene布尔运算符 (AND, OR, NOT, +, -):

    //使用逻辑运算符查询全文索引
    CALL db.index.fulltext.queryNodes("namesAndTeams", 'nils AND kernel') YIELD node, score
    RETURN node.name, node.team, score
    

    结果:

    node.namenode.teamscore
    “Nils-Erik Karlsson”“Kernel”0.723090410232544
  • 示例五:
    通过在查询字符串前加上<propertyName>前缀,可以将搜索限制为特定的属性。

    // 查询特定属性的全文索引
    CALL db.index.fulltext.queryNodes("namesAndTeams", 'team:"Operations"') YIELD node, score
    RETURN node.name, node.team, score
    

    结果:

    node.namenode.teamscore
    “Nils Johansson”“Operations”0.21363800764083862
    “Maya Tanaka”“Operations”0.21363800764083862

Lucene查询语法的完整描述可以在Lucene文档 中找到。

4.2.字符串值列表

如果索引属性包含STRING值列表,则独立分析每个条目,并且所有生成的令牌都与相同的属性名称相关联。这意味着在查询这样的索引节点或关系时,如果任何列表元素与查询字符串匹配,则存在匹配。出于评分目的,全文索引将其视为单个属性值,分数将表示查询与匹配整个列表的接近程度。

  • 示例:
    // 查询STRING属性列表中显示的内容的全文索引
    CALL db.index.fulltext.queryNodes('peerReviews', 'late') YIELD node, score
    RETURN node.name, node.peerReviews, score
    
    结果:
    node.namenode.peerReviewsscore
    “Nils-Erik Karlsson”[“Nils-Erik is difficult to work with.”, “Nils-Erik is often late for work.”]0.13076457381248474

5.show全文索引

要列出数据库中所有的全文索引,使用SHOW FULLTEXT INDEXES 命令。

// 显示数据库中的所有全文索引
SHOW FULLTEXT INDEXES
idnamestatepopulationPercenttypeentityTypelabelsOrTypespropertiesindexProviderowningConstraintlastReadreadCount
4“communications”“ONLINE”100.0“FULLTEXT”“RELATIONSHIP”[“REVIEWED”, “EMAILED”][“message”]“fulltext-1.0”NULL2023-10-31T15:06:10.270Z2
3“namesAndTeams”“ONLINE”100.0“FULLTEXT”“NODE”[“Employee”, “Manager”][“name”, “team”]“fulltext-1.0”NULL2023-10-31T15:07:48.874Z5
6“peerReviews”“ONLINE”100.0“FULLTEXT”“NODE”[“Employee”, “Manager”][“peerReviews”]“fulltext-1.0”NULL2023-10-31T15:09:05.391Z3

与搜索性能索引类似,SHOW命令可以过滤特定的列:

// 使用过滤显示全文索引
SHOW FULLTEXT INDEXES WHERE name CONTAINS "Team"
idnamestatepopulationPercenttypeentityTypelabelsOrTypespropertiesindexProviderowningConstraintlastReadreadCount
5“namesAndTeams”“ONLINE”100.0“FULLTEXT”“NODE”[“Employee”, “Manager”][“name”, “team”]“fulltext-1.0”NULLNULL0

要返回完整的索引详细信息,请使用YIELD子句

// 显示所有全文索引和所有返回列
SHOW FULLTEXT INDEXES YIELD *
idnamestatepopulationPercenttypeentityTypelabelsOrTypespropertiesindexProviderowningConstraintlastReadreadCount
4“communications”“ONLINE”100.0“FULLTEXT”“RELATIONSHIP”[“REVIEWED”, “EMAILED”][“message”]“fulltext-1.0”NULLNULL0
5“namesAndTeams”“ONLINE”100.0“FULLTEXT”“NODE”[“Employee”, “Manager”][“name”, “team”]“fulltext-1.0”NULLNULL0
6“peerReviews”“ONLINE”100.0“FULLTEXT”“NODE”[“Employee”, “Manager”][“peerReviews”]“fulltext-1.0”NULLNULL0

有关所有返回列的完整描述,请参见搜索性能索引——结果列

6.删除全文索引

命令: DROP INDEX 与其他索引类似
从数据库中删除先前创建的communications全文索引:

DROP INDEX communications

从Neo4j 5.16开始,索引名也可以作为删除索引时的参数:DROP index $name

7.全文索引程序列表

全文索引的步骤如下表所示:

使用程序/命令描述
最终一致的索引db.index.fulltext.awaitEventuallyConsistentIndexRefresh等待来自最近提交的事务的更新应用于任何最终一致的全文索引。
列出可用的分析器db.index.fulltext.listAvailableAnalyzers列出可以配置全文索引的可用分析程序。
使用全文节点索引db.index.fulltext.queryNodes查询给定的全文索引。返回匹配节点和它们的Lucene查询分数,按分数排序
使用全文关系索引db.index.fulltext.queryRelationships查询给定的全文索引。返回匹配关系和它们的Lucene查询分数,按分数排序

8.总结

  • 全文索引支持节点和关系的索引。
  • 全文索引只包括STRING或LIST类型的属性值。
  • 全文索引是通过Cypher过程访问的。
  • 全文索引返回查询的每个结果的分数。
  • 全文索引支持配置自定义分析器,包括Lucene本身不包含的分析器。
  • 全文索引可以使用Lucene查询语言进行查询。
  • 随着节点和关系的添加、删除和修改,全文索引自动保持最新。
  • 全文索引将自动用存储中的现有数据填充新创建的索引。
  • 全文索引可以由一致性检查器检查,如果有问题可以重新构建。
  • 新创建的全文索引将自动使用数据库中的现有数据填充。
  • 全文索引可以在单个索引中支持任意数量的属性。
  • 全文索引以事务方式创建、删除和更新,并在整个集群中自动复制。
  • 全文索引可以配置为最终一致,其中索引更新从提交路径移动到后台线程。使用这个特性,可以在性能关键的提交过程中解决缓慢的Lucene写入问题,从而消除Neo4j写入性能的主要瓶颈。

这篇关于neo4j使用详解(十五、索引之语义索引<全文索引>——最全参考)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894592

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

mysql索引四(组合索引)

单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引;组合索引,即一个索引包含多个列。 因为有事,下面内容全部转自:https://www.cnblogs.com/farmer-cabbage/p/5793589.html 为了形象地对比单列索引和组合索引,为表添加多个字段:    CREATE TABLE mytable( ID INT NOT NULL, use

mysql索引三(全文索引)

前面分别介绍了mysql索引一(普通索引)、mysql索引二(唯一索引)。 本文学习mysql全文索引。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。 在MySql中,创建全文索引相对比较简单。例如:我们有一个文章表(article),其中有主键ID(

mysql索引二(唯一索引)

前文中介绍了MySQL中普通索引用法,和没有索引的区别。mysql索引一(普通索引) 下面学习一下唯一索引。 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE,把它定义为一个唯一索引。 添加数据库唯一索引的几种

mysql索引一(普通索引)

mysql的索引分为两大类,聚簇索引、非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引则不同。聚簇索引能够提高多行检索的速度、非聚簇索引则对单行检索的速度很快。         在这两大类的索引类型下,还可以降索引分为4个小类型:         1,普通索引:最基本的索引,没有任何限制,是我们经常使用到的索引。         2,唯一索引:与普通索引

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了