是否可以使用数据驱动的节点或关系标签进行合并?

时间:2017-05-02 14:08:01

标签: neo4j cypher graph-databases

我通过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程序,但我需要的是在动态标签上合并。更新了标题以反映这一点。

3 个答案:

答案 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几乎相同。

非常感谢您的参考:SET label : pass label name as parameter