Neo4j中没有节点添加到索引中

时间:2016-07-06 22:05:23

标签: indexing neo4j cypher

我用来创建节点的查询如下

load csv with headers from "file:/sample.csv" as Jobs
create (TheJobs {Job_name: Jobs.insert_job, Job_type: Jobs.job_type, Owner: Jobs.#owner}) 
return TheJobs

我用来创建索引的命令是

CREATE INDEX ON :TheJobs(Job_name)

Output: Added 1 index, statement executed in 32 ms.

然后我尝试使用以下查询创建关系

Profile load csv with headers from "file:/Jobstofiles.csv" 
as rels2 
match (from :Files {Filename: rels2.Filename}) 
where rels2.Automatic or Manual="Automatic"
match (to :TheJobs {Job_name: rels2.Job}) 
create (from)-[:Is_triggered_by {type: rels2.Is_triggered_by}]->(to) 
return from, to 

执行计划显示nodeindexseek,但当数据明显匹配时返回零行/匹配

当我尝试使用以下查询从索引中搜索节点时

PROFILE MATCH (node :Jobindex {Job_name: 'Job1'}) RETURN node

Output: 0 rows

我做错了什么?

1 个答案:

答案 0 :(得分:1)

我想您可能误读了neo4j中索引的使用方式。

您创建索引:

CREATE INDEX ON :Jobindex(Job_name)

不会在所有节点的Job_name属性上创建一个名为Jobindex的索引,这不是它的工作原理。

相反,您所做的是使用:Jobindex标签在节点的Job_name属性上创建索引。这意味着只有在具有Job_name属性的Jobindex节点时才使用此索引。

如果需要在不同类型的节点上编写Job_name属性的索引,请创建一个带有该节点标签的索引。如果要在具有不同标签的节点上对该属性建立索引,请考虑是否有一些更通用的标签可以应用于这些节点,然后对其进行索引(请记住,节点可以有多个标签)。

至于使用索引,虽然有办法强制使用索引,但这些并不常见。索引使用在很大程度上是不可见的,没有特殊的语法,只需使用碰巧索引的属性编写匹配,索引将在引擎盖下使用(如果存在)以加快查找速度。

换句话说,如果您编入索引:Job(Job_name),并且您想按名称查找作业,则可以使用以下命令查询:

MATCH (job:Job{Job_name:"Software Engineer"})
...

如果没有索引,您将如何查询它。

我建议rereading the Schema section Cypher手册。

编辑:添加示例。

因此,假设在要导入的数据中,您希望使用:Job标签创建节点,该标签将具有Job_name属性,以便按名称快速查找。

您需要像这样创建索引:

CREATE INDEX ON :Job(Job_name)

这样,任何明确使用:Job节点及其Job_name属性的操作都将利用该索引来提高查找速度,如果可能的话。

但是,如果您有不同的情况,需要对具有相同属性的不同类型的节点进行索引,则仍需要该索引的公共标签。如果这仅用于数据导入,那么您可能会作弊,并创建具有多个标签的节点,其中一个标签是您创建索引的标签。然后,当您完成导入操作后,如果索引对您没有任何用处,您可以将其删除。