refcard - Cifrado Neo4j: importa CSV y agrega relaciones entre nodos según los valores de csv.
neo4j tutorial (2)
¿Es posible en Cypher crear una relación diferente entre nodos basada en el valor de csv utilizando la funcionalidad de importación?
Por ejemplo: para un dato de csv dado
product_id user_id action
1 1 VIEW
1 2 PURCHASE
Necesito crear un nodo de producto (id_producto), un nodo de usuario (id_usuario) y VER o COMPARAR una relación entre '' usuario '' y nodo de producto en función del valor del campo '' acción '' en csv.
A continuación están los enfoques que probé. Sé que la sintaxis es incorrecta, pero solo para dar una idea de lo que estoy tratando de hacer.
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file://pathto/product-event.csv" AS csvLine
FIELDTERMINATOR '',''
MERGE ( prod:Product{pid: toInt(csvLine.product_id)} )
MERGE ( usr:User { cid: toInt(csvLine.userid) })
WITH prod,usr , CASE
WHEN csvLine.action =''VIEW'' THEN ''VIEW''
WHEN csvLine.action =''PURCHASE'' THEN ''PURCHASE''
ELSE ''VIEW'' END AS action
MERGE (usr)-[:action]->(prod)
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///pathto/product-event.csv" AS csvLine
FIELDTERMINATOR '',''
MERGE ( prod:Product {pid: toInt(csvLine.productid) } )
MERGE ( usr:User { cid: toInt(csvLine.userid) }
)
ON CREATE SET
prod.created=timestamp()
WHERE csvLine.action = ''VIEW''
MERGE (cust)-[:VIEW]->(prod)
WHERE csvLine.action = ''PURCHASE''
MERGE (usr)-[:PURCHASE]->(prod)
Puede haber una manera simple de hacerlo. pero no recibo ninguna referencia en línea. Gracias.
No puede tener tipos de relación dinámica. Sin embargo, hay una solución al FOREACH
condicionalmente una matriz con 1 o 0 elementos y aplicar FOREACH
:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file://pathto/product-event.csv" AS csvLine
FIELDTERMINATOR '',''
MERGE ( prod:Product{pid: toInt(csvLine.product_id)} )
MERGE ( usr:User { cid: toInt(csvLine.userid) })
FOREACH(ignoreMe IN CASE WHEN csvLine.action=''VIEW'' THEN [1] ELSE [] END |
MERGE (usr)-[:VIEW]->(prod) )
FOREACH(ignoreMe IN CASE WHEN csvLine.action=''PURCHASE'' THEN [1] ELSE [] END |
MERGE (usr)-[:PURCHASE]->(prod) )
Ver también http://www.markhneedham.com/blog/2014/08/22/neo4j-load-csv-handling-empty-columns .
No es exactamente lo que quiere, pero posiblemente sea efectivo:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file://pathto/product-event.csv" AS csvLine
FIELDTERMINATOR '',''
MERGE ( prod:Product{pid: toInt(csvLine.product_id)} )
MERGE ( usr:User { cid: toInt(csvLine.userid) })
MERGE (usr)-[:action {type: csvLine.action}]->(prod) )