分解此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"}
]
但是你一次只能对一种类型的节点这样做,并且(据我所知)无法动态添加所需的关系属性。
任何见解都将受到赞赏。
答案 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)