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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/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 Python连接器创建/合并图形时出现CyphereError_Python_Neo4j_Cypher - Fatal编程技术网

使用Neo4j Python连接器创建/合并图形时出现CyphereError

使用Neo4j Python连接器创建/合并图形时出现CyphereError,python,neo4j,cypher,Python,Neo4j,Cypher,您好,我在尝试创建/合并节点和关系时遇到以下错误。它并不总是发生,但偶尔会发生一次 CyphereError:发生意外故障,请参阅中的详细信息 数据库日志,参考号eaf50bff-deca-4055-9450-6a76c31534e4 这是回溯: --------------------------------------------------------------------------- CypherError Tracebac

您好,我在尝试创建/合并节点和关系时遇到以下错误。它并不总是发生,但偶尔会发生一次

CyphereError:发生意外故障,请参阅中的详细信息 数据库日志,参考号eaf50bff-deca-4055-9450-6a76c31534e4

这是回溯:

---------------------------------------------------------------------------
CypherError                               Traceback (most recent call last)
<ipython-input-21-9700f3a5d3fa> in <module>()
      7     tx.success = True
      8     #tx.close()
----> 9   session.close()

/databricks/python/local/lib/python2.7/site-packages/neo4j/v1/session.pyc in close(self)
    522         """
    523         if self.last_result:
--> 524             self.last_result.buffer()
    525         if self.transaction:
    526             self.transaction.close()

/databricks/python/local/lib/python2.7/site-packages/neo4j/v1/session.pyc in buffer(self)
    246         if self.connection and not self.connection.closed:
    247             while not self._consumed:
--> 248                 self.connection.fetch()
    249             self.connection = None
    250
chunk_list是一个包含多个记录列表的列表。chunk_列表中的每个列表都有多行(约10000行),每行包含三列:源、目标和时间戳

对于chunk_list中的每个列表,我们将打开一个会话,然后执行合并操作,然后关闭会话


当图形超过1000万个节点时,问题开始出现。假设第一天区块列表有400万行,它可以正常工作;第二天区块列表有400万行,它也可以正常工作。但是,如果在第3天,Neo4j图形中有300万行,并且节点总数超过1000万,那么问题就开始出现。

执行这项操作需要很长时间的原因之一是您的查询没有执行您认为它正在执行的操作

进行合并就像尝试首先进行匹配,如果没有找到匹配项,则执行创建

在您的评论中,您说过时间戳应该在合并操作期间更改,因此您真正想要做的是更新具有相同用户ID的节点的属性,但合并并不是这样做的

您的合并首先尝试将:UID节点与给定的userid和timestamp匹配,但在图形中不会有这样的节点,因为timestamp是新的…将有一个:UID节点具有相同的userid,但具有不同的timestamp,因此找不到匹配项,将创建一个全新的:UID节点,其用户ID与现有节点相同,并且具有新的时间戳

因此,合并总是要创建新节点,而不会在现有节点上进行匹配。单独合并永远不会更新属性值,因此永远不要尝试以这种方式使用它

要执行匹配和更新,只需基于要在现有节点上匹配的最小唯一属性进行合并,然后使用SET更新属性,如下所示:

for chunk in chunk_list: 
  with session.begin_transaction() as tx:
    for record in chunk:
      tx.run("MERGE (source:UID {userid : {m}})"
             "SET source.timestamp = {a}"
             "MERGE (target:UID {userid : {n}})"
             "SET target.timestamp = {a}"
             "MERGE (source)-[:HasConnection]-(target)", {"m": record.source, "n": record.target, "a": record.unix_timestamp_s})
    tx.success = True
    #tx.close()
  session.close()
此外,为了确保合并速度快,您需要在:UID(userid)上具有索引或唯一约束,否则neo4j将不得不进行标签扫描以查找节点,这对于图形的大小来说太慢了

编辑

我还没有在Neo4j中使用Python,但我不确定这种循环是否是处理多个记录的正确方法,因为它看起来将运行给定密码段的大量副本。每行5行密码似乎非常极端……理想情况下,您应该使用密码代码同时对所有行进行操作(或至少对每个区块的行进行操作),并且您的输入可以轻松地转换为行以便执行

更好的方法可能是使用循环生成对象列表(具有“m”和“n”属性),并将列表和单个时间戳作为参数提交给查询

然后,您可以将密码中的列表放回到行中,并使用它。因此,如果“row”是您的对象列表参数,“a”仍然是您的unix时间戳参数,那么Cypher段将如下所示:

UNWIND {row} as line
MERGE (source:UID {userid : line.m})
SET source.timestamp = {a}
MERGE (target:UID {userid : line.n})
SET target.timestamp = {a}
MERGE (source)-[:HasConnection]-(target)

发生这种情况的原因是数据库耗尽了日志中记录的磁盘空间。

因为您正在合并同时具有userid和timestamp的:UID节点,userid+timestamp组合是:UID的唯一查找键,这意味着可以有多个:UID具有相同的userid但具有不同的时间戳,对吗?或者userid是唯一的查找键,并且您正在尝试更新时间戳并创建连接?它应该是相同的userid,但时间戳在合并操作期间会更改@InverseFalconThank用于更正,问题与磁盘空间有关。编辑我的回答以指出,使用循环生成密码事务的给定方法可能不是解决此问题的正确方法。
UNWIND {row} as line
MERGE (source:UID {userid : line.m})
SET source.timestamp = {a}
MERGE (target:UID {userid : line.n})
SET target.timestamp = {a}
MERGE (source)-[:HasConnection]-(target)