我用来创建节点的查询如下
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
我做错了什么?
答案 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属性的操作都将利用该索引来提高查找速度,如果可能的话。
但是,如果您有不同的情况,需要对具有相同属性的不同类型的节点进行索引,则仍需要该索引的公共标签。如果这仅用于数据导入,那么您可能会作弊,并创建具有多个标签的节点,其中一个标签是您创建索引的标签。然后,当您完成导入操作后,如果索引对您没有任何用处,您可以将其删除。