【问题标题】:Batch node relationship creation in cypher/neo4j在 cypher/neo4j 中批量创建节点关系
【发布时间】:2014-01-28 02:49:00
【问题描述】:

分解此 CREATE 密码查询的最有效方法是什么?

结束模式如下:

(newTerm:term)-[:HAS_META]->(metaNode:termMeta)

在这个模式中,这是一个单独的 newTerm 节点和大约 25 个 termMeta 节点。 HAS_META 关系将有一个属性(languageCode),每个 termMeta 节点都不同。

在应用程序中,所有这些节点和关系将同时创建。我正在尝试确定添加它们的最佳方式。

是否可以添加这些而不必为每个 TermMeta 节点执行单独的查询?

我知道您可以使用以下查询格式添加节点的多个实例:

 "metaProps" : [ 
            {"languageCode" : "en", "name" : "1", "dateAdded": "someDate1"}, 
            {"languageCode" : "de", "name" : "2", "dateAdded": "someDate2"},
            {"languageCode" : "es", "name" : "3", "dateAdded": "someDate3"}, 
            {"languageCode" : "fr", "name" : "3", "dateAdded": "someDate4"}
        ]

但是您一次只能对一种类型的节点执行此操作,并且(据我所知)无法动态添加所需的关系属性。

任何见解将不胜感激。

【问题讨论】:

    标签: database neo4j cypher


    【解决方案1】:

    据我所知,没有真正优雅的方法可以做到这一点 - 从您的示例中,我假设您正在使用参数。您可以使用 foreach 循环遍历参数并对每个参数进行创建,但这非常难看,并且需要您明确指定属性的文字映射。这是您的示例的样子:

    CREATE (newTerm:term)
    FOREACH ( props IN {metaProps} | 
      CREATE newTerm-[:HAS_META {languageCode: props.languageCode}]->
               (:termMeta {name: props.name, dateAdded: props.dateAdded})
    )
    WITH newTerm
    MATCH newTerm-[rel:HAS_META]->(metaNode:termMeta)
    RETURN newTerm, rel, metaNode
    

    如果不需要返回结果,可以删除FOREACH之后的所有内容。

    【讨论】:

    • 谢谢乔恩。我看到 FOREACH 存在,但不知道您可以在属性上使用它。
    【解决方案2】:

    选择并命名每个顶点,然后使用它创建关系。 例如

    match (n:Tag), (m:Account), (l:FOO) CREATE (n)-[r:mn]->(m),(m)-[x:ml]->(l)
    
    match (n:Tag{a:"a"}), (m:Account{b:"x"}), (l:FOO) CREATE (n)-[r:mn]->(m),(m)-[x:ml]->(l)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多