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
数据模型如何影响使用CYPHER的neo4j写入性能?_Neo4j_Neo4j Spatial - Fatal编程技术网

数据模型如何影响使用CYPHER的neo4j写入性能?

数据模型如何影响使用CYPHER的neo4j写入性能?,neo4j,neo4j-spatial,Neo4j,Neo4j Spatial,我一直在努力使用Neo4J 3.0.3为我的应用程序实现可接受的性能。以下是一些背景: 我试图用Neo4j替换ApacheSolr,以扩展应用程序的功能,同时保持或提高性能 在Solr中,我的文档基本上如下所示: { "time": "2015-08-05T00:16:00Z", "point": "45.8300018311,-129.759994507", "sea_water_temperature": 18.49, "sea_water_temperature_depth": 4, "w

我一直在努力使用Neo4J 3.0.3为我的应用程序实现可接受的性能。以下是一些背景:

我试图用Neo4j替换ApacheSolr,以扩展应用程序的功能,同时保持或提高性能

在Solr中,我的文档基本上如下所示:

{
"time": "2015-08-05T00:16:00Z",
"point": "45.8300018311,-129.759994507",
"sea_water_temperature": 18.49,
"sea_water_temperature_depth": 4,
"wind_speed": 6.48144,
"eastward_wind": 5.567876,
"northward_wind": -3.3178043,
"wind_depth": -15,
"sea_water_salinity": 32.19,
"sea_water_salinity_depth": 4,
"platform": 1,
"mission": 1,
"metadata": "KTDQ_20150805v20001_0016"
}
因为Solr是一个键值数据存储,所以我最初对Neo4J的翻译将非常简单,这样我就可以感受到使用API的感觉

我的方法本质上是让每个Solr记录等同于一个Neo4J节点,其中每个键值都将成为节点属性

显然,需要进行一些调整(将None更改为‘None’(python),将ISO时间更改为epoch时间(neo4j不支持索引日期时间),将point更改为lat/lon(neo4j空间索引),等等)

我的目标是使用这个模型加载Neo4J,不管它有多幼稚

下面是加载到单个记录时进行的rest调用示例(使用http:localhost:7474/db/data/cypher作为端点):

请注意,我实际上删除了很多用于测试neo4j的参数

目前我有严重的性能问题。为我将这样的文档加载到Solr大约需要2秒钟。对于Neo4J,需要:

使用REST API大约20秒

使用螺栓约45秒

使用py2neo约70秒

我需要加载5000万条记录。在Solr中执行此操作通常需要24小时,因此Neo4J可能需要将近一个月的时间

我记录了这些时间,没有对“meta”属性使用唯一性约束,也没有将每个节点添加到空间索引中。这种情况下的时间结果非常糟糕

遇到这个问题,我尝试在网上搜索性能调整。以下事情并没有改善我的处境:

-将打开的文件限制从1024增加到40000

-使用ext4,并根据文档对其进行调整

-将页面缓存大小增加到16 GB(我的系统有32个)

到目前为止,我只讨论了加载时间。在一夜之间加载了大约50000个节点后,我尝试对我的空间索引进行如下查询:

CALL spatial.withinDistance('my_layer', lon : 34.0, lat : 20.0, 1000)
MATCH (r:record) WHERE r.time > {} AND r.time < {} RETURN r;
在我的时间索引上也是如此:

CALL spatial.withinDistance('my_layer', lon : 34.0, lat : 20.0, 1000)
MATCH (r:record) WHERE r.time > {} AND r.time < {} RETURN r;
使用这种方法,实际的.run()语句几乎可以在短时间内运行。.close()语句是所有运行时发生的位置

我的修改方法:

transaction = ''
for tuple in mydata:
    statement = build_statement(tuple)
    transaction += ('\n' + statement)
with session.begin_transaction() as tx:
    tx.run(transaction)
session.close()

我有点困惑,因为这种行为几乎是一样的。close()仍然需要大约45秒,只是它没有提交。由于我在每个语句(CREATE(r:record{…})…CREATE(r:record{…})…)中重用相同的标识符,因此我得到了有关此行为的CypherError。我现在真的不知道如何避免这个问题,而且,运行时间似乎根本没有改善(我希望一个错误会使这个问题更快地终止)。

您正在使用什么索引(浏览器中的
:schema
的结果是什么)?请注意,对于插入,您应该将许多
CREATE
语句组合到单个事务中,以提高性能。每个事务可以执行约10k个数据库操作。对于大型初始批量加载,考虑模式的结果给了我<代码>索引:在线记录(时间):记录(Meta)在线(对于唯一性约束)约束(记录:记录)断言记录。Meta是唯一的< /代码>…我没有尝试批量工具,因为我不想在处理过程中创建这么多中间文件。如果其他一切都失败了,我想我可以试一试。我将按照您的建议尝试加入create语句。好的,我尝试加入这些语句,但我有点卡住了。我正在编辑我上面的Q,并进行跟踪。您使用的索引是什么(浏览器中的
:schema
的结果是什么)?请注意,对于插入,您应该将许多
CREATE
语句组合到单个事务中,以提高性能。每个事务可以执行约10k个数据库操作。对于大型初始批量加载,考虑模式的结果给了我<代码>索引:在线记录(时间):记录(Meta)在线(对于唯一性约束)约束(记录:记录)断言记录。Meta是唯一的< /代码>…我没有尝试批量工具,因为我不想在处理过程中创建这么多中间文件。如果其他一切都失败了,我想我可以试一试。我将按照您的建议尝试加入create语句。好的,我尝试加入这些语句,但我有点卡住了。我正在编辑上面的问题,并进行跟进。