neo4j不在node.js中创建节点之间的关系

时间:2019-12-04 19:12:53

标签: node.js database neo4j cypher

我有以下问题:

我正在尝试在节点之间创建neo4j关系,但是在第一次将第二个查询插入neo4j db后, neo4j不在节点 TechnologyComponent-> TechComponentToTechRel-> Technology之间创建关系。第二次执行后,它就可以工作了。

我认为问题是第二个查询中的MATCH子句失败。可能是因为匹配的节点是在稍后创建的,然后才是所需的关系。无论如何,我无法创建它,但是创建了TechComponentToTechRel和Technology节点。

我想实现: enter image description here

在第一个查询 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中存在多个关系,例如

  1. ProjectToTechComponentRel-> TechnologyComponent1

  2. ProjectToTechComponentRel-> TechnologyComponent2 ...

然后,我执行了包含承诺的数组 technologyNodeArray ,该数组应创建以下关系,但上述关系不起作用。

  1. TechnologyComponent-> TechComponentToTechRel_1-。技术_1
  2. 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不建立这种关系?

感谢您的回答。

0 个答案:

没有答案