首页 > 解决方案 > neo4j cypher 基于属性字符串值创建两个节点之间的关系

问题描述

我有一个带有标签 Experiment 的节点,其属性名为 ExperimentName。

这个 ExperimentName 是基于 3 个不同变量的串联

“条件(ExperimentProfile1)剂量”

例子 :

Control diet (MOA77) LD
Control gavage(MOA66) HD

我有另一个名为 ExperimentMapper 的节点,它有 3 个属性: - Condition - ExperimentProfile - Dose

当 ExperimentName是 3 个属性组装的结果时,我想在 Node Experiment和 Node ExperimentMapper之间创建一个关系。

我曾尝试使用正则表达式,但查询速度非常慢并且需要很长时间..

有什么帮助吗?

这是我的密码,但尽管我创建了索引,但它需要永远

MATCH (mxpExperiment:MxpExperiment) OPTIONAL MATCH (otuExperimentMapper:OtuExperimentMapper) 
WHERE  mxpExperiment.name CONTAINS otuExperimentMapper.Condition 
AND mxpExperiment.name CONTAINS otuExperimentMapper.Experiment
AND mxpExperiment.name CONTAINS otuExperimentMapper.dose

CREATE (mxpExperiment)-[:OTU_EXPERIMENT_MAPPER]->(otuExperimentMapper)
RETURN mxpExperiment, otuExperimentMapper

标签: neo4jcypherneo4j-apoc

解决方案


我认为你需要从Experiment Mapper.

首先你需要创建一个索引:

CREATE INDEX ON :MxpExperiment(name)

那么查询可以如下:

MATCH (otuExperimentMapper:OtuExperimentMapper) 
WITH otuExperimentMapper,
     otuExperimentMapper.Condition  + ' (' +
     otuExperimentMapper.Experiment + ') ' +
     otuExperimentMapper.dose AS name
MATCH (mxpExperiment:MxpExperiment) WHERE mxpExperiment.name = name
MERGE (mxpExperiment)-[:OTU_EXPERIMENT_MAPPER]->(otuExperimentMapper)
RETURN mxpExperiment, otuExperimentMapper

推荐阅读