我通过Neo4J JDBC驱动程序处理准备好的语句,并且需要创建名称由我们将接收的数据驱动的节点和关系标签。
例如,我想在这些方面创建一个准备好的声明:
MERGE (test:{1} {id: {2}) ON CREATE SET test.id = {2}
OR
MERGE (test:Test)-[:{1}]->(test2:Test)
这些目前无法使用,因为看起来Neo4J并未将占位符{1}
解释为占位符,而是将其视为无效的标签名称。
我探索的另一种可能性是我们可以通过存储过程扩展Cypher,但我怀疑我们可能遇到同样的限制。
希望有人能够提供一些见解,确定是否有任何方法可以通过Cypher实现这一目标。
谢谢!
更新
下面的答案建议使用APOC的apoc.create.node
程序,但我需要的是在动态标签上合并。更新了标题以反映这一点。
答案 0 :(得分:2)
我最终使用了与APOC不同的程序 - apoc.cypher.doIt
,因为事实证明APOC还没有办法与动态标签合并。请参阅功能请求:https://github.com/neo4j-contrib/neo4j-apoc-procedures/issues/271
以下是我最终做的事情。请注意,要求是对集合进行迭代(在本例中使用UNWIND),并使用从此集合中提取的动态标签合并节点,然后合并预先存在的节点与此新节点之间的关系:
WITH myNode, myList
UNWIND categories AS catArray
WITH myNode, 'MERGE (cat:' + catArray[0] + ' {value: "' + catArray[1] + '" }) ON CREATE SET cat.value = \"' + catArray[1] + '\" RETURN cat' AS cypher
CALL apoc.cypher.doIt(cypher, {}) YIELD value
WITH myNode, value.cat as cat
MERGE (myNode)-[:IN_CATEGORY]->(cat)
答案 1 :(得分:1)
您可以使用APOC创建动态关系。存在类似的APOC过程,用于创建具有动态标签的节点或向节点添加动态标签。
MERGE (test:Test {name: 'Test'})
WITH test
MERGE (test2:Test {name: 'Test 2'})
WITH test, test2
CALL apoc.create.relationship(test, {new_rel_type}, {}, test2) YIELD rel
RETURN test, test2, rel
答案 2 :(得分:0)
经过近半天的努力,我终于找到了这个方法:
UNWIND {batch} as row
MERGE (n { id: row.id }) SET n += row.properties
WITH n
CALL apoc.create.addLabels(id(n), [n.label]) YIELD node
RETURN node
而且表现与纯粹的MERGE几乎相同。