使用“合并”或“匹配”将关系插入Neo4j将永远运行
我正在使用一个简单的位置数据集来试验Neo4j。一个位置可以与另一个位置有关系。 a:位置-[rel]-b:位置 我已经在数据库中找到了位置(大约700.000多个位置条目) 现在我想添加关系数据(170M边),但我想先用较小的集合试验导入逻辑,所以我基本上选择了集合中的两个节点,并尝试创建如下关系使用“合并”或“匹配”将关系插入Neo4j将永远运行,neo4j,cypher,Neo4j,Cypher,我正在使用一个简单的位置数据集来试验Neo4j。一个位置可以与另一个位置有关系。 a:位置-[rel]-b:位置 我已经在数据库中找到了位置(大约700.000多个位置条目) 现在我想添加关系数据(170M边),但我想先用较小的集合试验导入逻辑,所以我基本上选择了集合中的两个节点,并尝试创建如下关系 MERGE p =(a:Location {locationid: 3616})-[w:WikiLink]->(b:Location {locationid: 467501}) RETURN
MERGE p =(a:Location {locationid: 3616})-[w:WikiLink]->(b:Location {locationid: 467501})
RETURN p;
并且还直接从docu尝试了这种方法
MATCH (a:Person),(b:Person)
WHERE a.name = 'Node A' AND b.name = 'Node B'
CREATE (a)-[r:RELTYPE { name : a.name + '<->' + b.name }]->(b)
RETURN r
这是我目前正在使用的:
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'file:///edgelist.csv' AS line WITH line
MATCH (a:Location {locationid: toInt(line.locationidone)}), (b:Location {locationid: toInt(line.locationidtwo)})
MERGE (a)-[w:WikiLink {weight: toFloat(line.edgeweight)}]-(b)
RETURN COUNT(w);
如果查看下面的终端输出,您可以看到Neo4j报告258ms查询执行时间,但实时时间略高于此值。在我看来,这个查询已经花费了太多的时间(它运行的机器有48GB的RAM,16个内核,而且相对较新)。
我当前正在使用LIMIT 1000
(在LIMIT 1
之前)运行此查询,但脚本已经运行了几分钟。我想知道我是否必须从合并切换到创建。问题是,我无法理解EXPLAIN
为确定瓶颈而提供的调用图
time /usr/local/neo4j/bin/neo4j-shell -file import-relations.cql
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| p |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [Node[758609]{title:"Tehran",locationid:3616,locationlabel:"NIL"},:WikiLink[9422418]{weight:1.2282325516616477E-7},Node[917147]{title:"Khorugh",locationid:467501,locationlabel:"city"}] |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row
Relationships created: 1
Properties set: 1
258 ms
real 0m1.417s
user 0m1.497s
sys 0m0.158s
如果您没有:
create constraint on loc:Location assert loc.locationid is unique;
然后找到两个节点,并创建关系
MATCH (a:Location {locationid: 3616}),(b:Location {locationid: 467501})
MERGE p = (a)-[w:WikiLink]->(b)
RETURN p;
或者,如果位置还不存在:
MERGE (a:Location {locationid: 3616})
MERGE (b:Location {locationid: 467501})
MERGE p = (a)-[w:WikiLink]->(b)
RETURN p;
如果从程序中执行此操作,还应使用参数。是否已为
locationid
上的Location
节点编制索引
CREATE INDEX ON :Location(locationid)
我遇到了一个类似的问题,将边添加到图形中,并对节点进行索引,从而使链接运行速度加快了150倍
如果节点未编制索引,neo4j将对两个节点进行串行搜索以链接在一起。
使用定期提交:
指定要在事务中提交的记录(行)数。因为您有高RAM,所以最好使用大于100000的值。这将减少提交的事务数,并可能进一步缩短总时间。我更新了我的问题,为您提供了更多信息。我想如果你看看我的查询,我已经使用了你建议的方法,如果我错了,你可能会纠正我。你使用的是neo4j
的哪个版本?是的,我就是这么做的。我对该字段有唯一的约束和索引。
CREATE INDEX ON :Location(locationid)