Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用“合并”或“匹配”将关系插入Neo4j将永远运行_Neo4j_Cypher - Fatal编程技术网

使用“合并”或“匹配”将关系插入Neo4j将永远运行

使用“合并”或“匹配”将关系插入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

我正在使用一个简单的位置数据集来试验Neo4j。一个位置可以与另一个位置有关系。 a:位置-[rel]-b:位置

我已经在数据库中找到了位置(大约700.000多个位置条目)

现在我想添加关系数据(170M边),但我想先用较小的集合试验导入逻辑,所以我基本上选择了集合中的两个节点,并尝试创建如下关系

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)