我有以下问题:
我正在尝试在节点之间创建neo4j关系,但是在第一次将第二个查询插入neo4j db后, neo4j不在节点 TechnologyComponent-> TechComponentToTechRel-> Technology之间创建关系。第二次执行后,它就可以工作了。
我认为问题是第二个查询中的MATCH子句失败。可能是因为匹配的节点是在稍后创建的,然后才是所需的关系。无论如何,我无法创建它,但是创建了TechComponentToTechRel和Technology节点。
在第一个查询 CREATE_TECHNOLOGY_COMPONENT_NODE 中,我正在创建关系的第一部分,也是节点TechnologyComponent: ProjectToTechComponentRel-> TechnologyComponent 。
const CREATE_TECHNOLOGY_COMPONENT_NODE =
'MATCH(ptc: ProjectToTechComponentRel {id:{id}, projectId:{projectId}}) ' +
'MERGE (tc: TechnologyComponent {name:{name}}) ' +
'MERGE(ptc)-[:HAS_TECHNOLOGY_COMPONENT]->(tc)';
在第二个查询 CREATE_TECHNOLOGY_NODE 中,我正在创建这三个节点 TechnologyComponent-> TechComponentToTechRel-> Technology 之间的关系,还创建了TechComponentToTechRel和Technology节点。
const CREATE_TECHNOLOGY_NODE =
'MERGE(tct:TechComponentToTechRel {projectId:{projectId}, prevTechComponentName:{name}, nextTechName:{techName}}) ' +
'ON CREATE SET tct.active = {active} ' +
'ON MATCH SET tct.active = {active} ' +
'MERGE(t:Technology {name:{techName}}) '+
'ON CREATE SET t.id={technologyId},' +
't.description = {description} ' +
'ON MATCH SET t.id={technologyId},' +
't.description={description} '+
'WITH tct, t '+
'MATCH(tc:TechnologyComponent {name:{name}}) '+
'MERGE(tc)-[:HAS_TECHNOLOGY_REL]->(tct)-[:HAS_NEW_TECHNOLOGY]->(t)';
这是node.js中的实现。
我正在创建两个承诺数组。数组 techComponentArray 包含第一个查询的承诺。因此,在使用Promises.all
执行之后,neo4j db中存在多个关系,例如
ProjectToTechComponentRel-> TechnologyComponent1
ProjectToTechComponentRel-> TechnologyComponent2 ...
然后,我执行了包含承诺的数组 technologyNodeArray ,该数组应创建以下关系,但上述关系不起作用。
TechnologyComponent-> TechComponentToTechRel_2-。技术_2 ...
async function createBlueprintNode({ id, projectId, model }) {
const technologyNodeArray = [];
const techComponentArray = model.map(({ name, technologies }) => {
if (technologies.length > 0) {
// console.log('technologies', technologies);
technologies.forEach(({ id: technologyId, name: techName, description }) => {
technologyNodeArray.push(
neo4jExecuteQuery(CREATE_TECHNOLOGY_NODE, {
id,
technologyId,
name,
projectId,
description,
techName,
active: 'active'
})
);
});
}
return neo4jExecuteQuery(CREATE_TECHNOLOGY_COMPONENT_NODE, { id, name, projectId });
});
await Promise.all(techComponentArray);
await Promise.all(technologyNodeArray);
}
为什么neo4j不建立这种关系?
感谢您的回答。