使用neo4j查询创建100万个关系的一些方法

时间:2017-07-10 21:30:43

标签: neo4j cypher load-csv

使用此查询,我将从我的csv文件导入75000个节点。 (类别)

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS 
FROM "file:///prodcategory.csv" AS row 
CREATE (:Category {id: row.idProdCategory, name: row.name, idRestaurant: row.idRestaurant});

通过此查询,我还从我的csv文件(产品)

导入了100万个节点
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS 
FROM "file:///products.csv" AS row 
CREATE (:Product {id: row.idProduct, idProductCategory: row.idProductCategory,name: row.name,idRestaurant:row.idRestaurant ,description: row.description, price: row.price, shipping_price: row.shippingPrice});

我正在使用此查询来创建id - >之间的关系category和idProductCategory - >产品

MATCH (category:Category {id: category.id})
MATCH (Product:Product {idProductCategory: Product.idProductCategory})
WHERE Product.idProductCategory=category.id
MERGE (category)-[:OF_CATEGORY]->(Product);

此查询仅创建2999个关系,我不相信我应该创建的100万个关系,如果有方法或配置能够创建超过100万个关系,请帮助我,我将非常感激。< / p>

2 个答案:

答案 0 :(得分:2)

确保Product.idProductCategory上有索引。

我假设类别ID在不同类别中是唯一的。

CREATE CONSTRAINT ON (category:Category) ASSERT category.id IS UNIQUE;

我假设有多个产品具有相同的类别ID。

CREATE INDEX ON :Product(idProductCategory);

然后,您可以简单地匹配每个类别,然后为每个类别找到合适的产品并创建关系。

// match all of your categories
MATCH (category:Category)

// then with each category find all the products
WITH category 
MATCH (Product:Product {idProductCategory: category.id })

// and then create the 
MERGE (category)-[:OF_CATEGORY]->(Product);

如果遇到内存限制,可以使用APOC定期提交来包装查询...

call apoc.periodic.commit("
  MATCH (category:Category)
  WITH category 
  MATCH (Product:Product {idProductCategory: category.id })
  MERGE (category)-[:OF_CATEGORY]->(Product)
",{limit:10000})

答案 1 :(得分:1)

尝试将您的查询更改为此...您在查询中使用了太多过滤器

检查docs for MATCH

MATCH (category:Category),(Product:Product)
WHERE Product.idProductCategory=category.id
MERGE (category)-[:OF_CATEGORY]->(Product)

您也可以只更改第二个导入查询,这样就不需要单独的查询来进行链接。

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS 
FROM "file:///products.csv" AS row 
CREATE (p:Product {id: row.idProduct, name: row.name,idRestaurant:row.idRestaurant ,description: row.description, price: row.price, shipping_price: row.shippingPrice})
MATCH (c:Category{id:row.idProductCategory}
MERGE (p)-[:OF_CATEGORY]->(c)