最近在研究图数据库Neo4j在网络安全中的应用,简单搜了一下说csv是一种不错的入库方式,于是我按照官网的教程,一步一步实现了数据入库,总的来说,还是比较简单的,这里记录一下。
ailx10
网络安全优秀回答者
网络安全硕士
去咨询
官网的教程[1]特别详细,只不过是英文的,我这边复现了一下,很简单。
如果csv文件没有头文件,导入的方式如下:
LOAD CSV FROM 'file:///products.csv' AS row
WITH toInteger(row[0]) AS productId, row[1] AS productName, toFloat(row[2]) AS unitCost
MERGE (p:Product {productId: productId})
SET p.productName = productName, p.unitCost = unitCost
RETURN count(p);
如果csv文件有头文件,区别是需要列名一致,导入的方式如下:
LOAD CSV WITH HEADERS FROM 'file:///orders.csv' AS row
WITH toInteger(row.orderID) AS orderId, datetime(replace(row.orderDate,' ','T')) AS orderDate, row.shipCountry AS country
MERGE (o:Order {orderId: orderId})
SET o.orderDateTime = orderDate, o.shipCountry = country
RETURN count(o);
另外对一些ID添加索引,可以加快入库性能:
CREATE CONSTRAINT UniqueProduct ON (p:Product) ASSERT p.id IS UNIQUE;
CREATE CONSTRAINT UniqueOrder ON (o:Order) ASSERT o.id IS UNIQUE;
上面说的都是点的入库方式,下面来看看边的入库方式:
:auto USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM 'file:///order-details.csv' AS row
WITH toInteger(row.productID) AS productId, toInteger(row.orderID) AS orderId, toInteger(row.quantity) AS quantityOrdered
MATCH (p:Product {productId: productId})
MATCH (o:Order {orderId: orderId})
MERGE (o)-[rel:CONTAINS {quantityOrdered: quantityOrdered}]->(p)
RETURN count(rel);
这个时候就大功告成了,可以欣赏效果图了~
MATCH (o:Order)-[rel:CONTAINS]->(p:Product)
RETURN p, rel, o LIMIT 50;
参考
- ^neo4j入库案例 https://neo4j.com/developer/desktop-csv-import/