Estoy trabajando con declaraciones preparadas a través del controlador Neo4J JDBC, y tengo la necesidad de crear etiquetas de nodo y relación cuyos nombres estén controlados por los datos que recibiremos.

Por ejemplo, me gustaría crear una declaración preparada a lo largo de estas líneas:

MERGE (test:{1} {id: {2}) ON CREATE SET test.id = {2}

O

MERGE (test:Test)-[:{1}]->(test2:Test)

Actualmente no funcionan, ya que parece que Neo4J no interpreta el marcador de posición {1} como un marcador de posición, sino que lo ve como un nombre de etiqueta no válido.

Otra posibilidad que estoy explorando es que podemos extender Cypher a través de un procedimiento almacenado, aunque sospecho que podemos encontrar la misma limitación.

Esperando que alguien pueda proporcionar alguna idea sobre si hay alguna manera de lograr esto con Cypher.

¡Gracias!

ACTUALIZACIÓN:

Una respuesta a continuación sugiere utilizar el procedimiento apoc.create.node de APOC, pero lo que necesito es fusionarme en una etiqueta dinámica. Se actualizó el título para reflejar esto.

3
Chris Staikos 2 may. 2017 a las 17:08

3 respuestas

La mejor respuesta

Terminé usando un procedimiento diferente de APOC - apoc.cypher.doIt, ya que resulta que APOC aún no tiene una forma de fusionarse con etiquetas dinámicas. Consulte la solicitud de funciones: https://github.com/neo4j-contrib/ neo4j-apoc-procedure / issues / 271

A continuación se muestra lo que terminé haciendo. Tenga en cuenta que el requisito era iterar (en este caso usando UNWIND) sobre una colección y fusionar nodos con etiquetas dinámicas extraídas de esta colección, y luego combinar una relación entre un nodo preexistente y este nuevo nodo:

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)
2
Chris Staikos 2 may. 2017 a las 19:33

Puede usar APOC para crear relaciones dinámicas. Existen procedimientos APOC similares para crear nodos con etiquetas dinámicas o agregar etiquetas dinámicas a los nodos.

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
1
Dave Bennett 2 may. 2017 a las 17:43

Después de intentarlo casi medio día, finalmente descubrí este método:

DESVIAR {lote} como fila MERGE (n {id: row.id}) SET n + = row.properties Con n LLAMAR apoc.create.addLabels (id (n), [n.label]) nodo YIELD Nodo RETURN y el rendimiento es casi el mismo que puramente MERGE.

Muchas gracias por esto, consulte: Etiqueta SET: pase el nombre de la etiqueta como parámetro

0
arganzheng 22 nov. 2017 a las 09:57