天天看点

Neo4j图数据库高性能入库方式

作者:ailx10
Neo4j图数据库高性能入库方式

最近在研究图数据库Neo4j在网络安全中的应用,简单搜了一下说csv是一种不错的入库方式,于是我按照官网的教程,一步一步实现了数据入库,总的来说,还是比较简单的,这里记录一下。

Neo4j图数据库高性能入库方式

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图数据库高性能入库方式

参考

  1. ^neo4j入库案例 https://neo4j.com/developer/desktop-csv-import/

继续阅读