在cypher / neo4j中创建批处理节点关系

时间:2014-01-28 02:49:00

标签: database neo4j cypher

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

结束模式如下:

(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"}
        ]

但是你一次只能对一种类型的节点这样做,并且(据我所知)无法动态添加所需的关系属性。

任何见解都将受到赞赏。

2 个答案:

答案 0 :(得分:3)

就我所知,从你的例子来看,我没有真正优雅的方法,我假设你正在使用参数。你可以使用foreach循环遍历params并在每个参数上进行创建,但它非常难看,并且要求你明确指定属性的文字地图。这是你的例子的样子:

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之后的所有内容。

答案 1 :(得分:0)

以不同的方式选择和命名每个顶点,然后使用它创建关系。 对于前

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)