首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Neo4jPythonConnector创建/合并图形时的CypherError

使用Neo4jPythonConnector创建/合并图形时的CypherError
EN

Stack Overflow用户
提问于 2017-01-03 17:38:27
回答 2查看 655关注 0票数 1

嗨,当我试图创建/合并节点和关系时,我收到了以下错误。它并不总是发生,但偶尔会发生一次。

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

这是回溯:

代码语言:javascript
运行
AI代码解释
复制
---------------------------------------------------------------------------
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

我创建/合并的代码如下:

代码语言:javascript
运行
AI代码解释
复制
for chunk in chunk_list: 
  with session.begin_transaction() as tx:
    for record in chunk:
      tx.run("MERGE (source:UID {userid : {m}, timestamp: {a}})"
             "MERGE (target:UID {userid : {n}, timestamp: {a}})"
             "MERGE (source)-[:HasConnection]-(target)", {"m": record.source, "n": record.target, "a": record.unix_timestamp_s})
    tx.success = True
    #tx.close()
  session.close()

chunk_list是一个包含多个记录列表的列表。chunk_list中的每个列表都有多个行(大约10000行),每一行包含三个列、源、目标和时间戳。

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

当图超过1000万个节点时,问题就会发生。让我们假设,对于第一天,chunk_list有400万行,它可以正常工作,对于第2天,如果chunk_list有400万行,它也可以正常工作。但是,如果在第3天,Neo4j图中有300万行,节点总数超过1,000万,那么问题就开始发生了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-08 08:17:51

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

票数 0
EN

Stack Overflow用户

发布于 2017-01-04 17:28:24

其中一个原因是执行起来花了这么长时间,因为您的查询没有执行您认为它正在做的事情。

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

在您的评论中,您说在合并操作期间时间戳应该更改,所以您真正想要做的是更新具有相同userid的节点的属性,但这不是您的合并所要做的。

您的合并首先尝试将a :UID节点与给定的userid和时间戳匹配,但图中不会有这样的节点,因为时间戳是new...there,它将是一个具有相同用户in但具有不同时间戳的:UID节点,因此将找不到匹配,将创建一个全新的:UID节点,该节点与现有节点具有相同的用户in,并创建新的时间戳。

因此,您的合并总是要创建新节点,而不是在现有节点上匹配。合并本身永远不会更新属性值,所以永远不要试图以这种方式使用它。

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

代码语言:javascript
运行
AI代码解释
复制
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,但我不确定这种循环是否是处理多条记录的正确方法,因为它看起来将运行给定Cypher段的大量副本。5行Cypher似乎是extreme...ideally,您应该使用Cypher代码同时对所有行(或至少每块行)进行操作,您的输入可以很容易地转换为行执行。

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

然后,您可以将Cypher中的列表解压回行,并使用该列表。因此,如果"row“是对象参数的列表,而"a”仍然是unix时间戳参数,则Cypher段看起来如下:

代码语言:javascript
运行
AI代码解释
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41454933

复制
相关文章
Hive左连接_oracle左外连接
大家好,又见面了,我是你们的朋友全栈君。 CREATE EXTERNAL TABLE IF NOT EXISTS a( telno STRING, other STRING ) PARTITIONED BY(day String) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘|’;
全栈程序员站长
2022/10/02
1.4K0
mysql左连接和右连接_MYSQL 左连接与右连接
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
全栈程序员站长
2022/09/05
16.4K0
mysql左连接和右连接_MYSQL 左连接与右连接
HQL的左连接_左连接与右连接的区别
,但是默认使用的内连接,就是说外键必须匹配的记录才能查出来,实现不了要求。 当我决定用左连接查询之后,做了很多尝试,但是因为对HQL不够熟悉,都没有达到要求。比如这样的
全栈程序员站长
2022/09/29
1.3K0
ClickHouse左连接
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/04
8880
ClickHouse左连接
mysql中左连接查询_mysql左连接「建议收藏」
查询语句开始 会根据 on后面的条件创建一张虚拟表,左边表是全部数据,右边表会根据on后面的条件进行筛选。
全栈程序员站长
2022/08/11
2.5K0
mysql数据库语句左连接_MySQL 左连接 右连接 详解
aID aNum bID bName
全栈程序员站长
2022/06/27
27.9K0
mysql 左连接 自连接 例子
逻辑:先通过左连接将看了湖南卫视和北京卫视的查出来,然后再将看了湖南卫视但不在刚才查出的结果中的用户查出来。
全栈程序员站长
2022/09/03
3.2K0
mysql 左连接 自连接 例子
左连接,右连接,内连接,外连接
这里之前一直没有写,主要原因觉得好多东西比较基础,没想都写,但是后来觉得,学习的话应该是扫盲和汇总的阶段,所以这里也单独写一下
名字是乱打的
2021/12/22
2.2K0
左连接,右连接,内连接,外连接
mysql左连接查询
左连接查询:以左表为主表,右表为从表,查询符合条件的数据 1.当右表中数据匹配不到时展示为空 例: 左表两条数据,按条件匹配到右表一条数据且匹配左表第一条,结果展示两条数据,且第二条数据右表中的字段全部为null 2.当匹配到右表的数据为多条时,左表数据会重复展示,不会自动合并 例: 左表数据一条,按条件匹配到右表数据三条,结果展示三条数据,左表数据均相同,右表数据不同
全栈程序员站长
2022/09/07
2.7K0
mysql连接查询(左连接,右连接,内连接)
以上就是MySQL 连接查询的资料整理,大家如有疑问可以留言讨论,共同进步,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
叫我可儿呀
2019/11/30
12.1K0
mysql连接查询(左连接,右连接,内连接)
内连接、左连接、右连接区别
`Aid` int(10) NOT NULL DEFAULT 1 COMMENT '主键' ,
一觉睡到小时候
2019/07/04
1.2K0
内连接、左连接、右连接区别
SQL查询左连接、右连接、内连接[通俗易懂]
1、左连接的定义:是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。左连接全称为左外连接,是外连接的一种。
全栈程序员站长
2022/07/22
8.1K0
SQL查询左连接、右连接、内连接[通俗易懂]
mysql左连接 右连接 内连接的区别[通俗易懂]
a表 id name b表 id job parent_id
全栈程序员站长
2022/09/05
2.8K0
Access/VBA/Excel-左连接-11
系统:Windows 7 软件:Excel 2010/Access 2010 这个系列开展一个新的篇章,重点关注Access数据库 主体框架:以Excel作为操作界面,Access作为数据库 今天讲讲如何将数据库中满足要求的数据拿出来 涉及知识:, Part 1:目标 成绩表 学生信息表 运行过程 获取学号为1101学生在不同年级的语文成绩,输出信息包括:姓名,学号,性别,年级,语文成绩 最终想要获得的信息来自于两个工作表,所以需要连接查询 逻辑过程 连接数据库 根据需求确定SQL语句 执行SQ
企鹅号小编
2018/01/10
1.1K0
Access/VBA/Excel-左连接-11
mysql左连接查询慢[通俗易懂]
之前一直用的Oracle,今天用mysql查询一个很普通的左连接的时候,发现速度很慢。 select x.fid,x.isbirt,x.fscoresum,x.fsystemscore,x.feffectivescore from tablea x left join tableb h on x.fitemid = h.fid where h.fprojectid=’’ 这个sql耗时:
全栈程序员站长
2022/08/31
2.9K0
mysql左连接查询慢[通俗易懂]
mysql左连接去重
create table TB_BATCH( ID int(11) not null auto_increment, BATCH_NO VARCHAR(32) comment ‘批次号’, CONTRACT_ID int(11) comment ‘合同ID’, CONTRACT_NO VARCHAR(64) comment ‘合同编号’, RULE_ID int(11) comment ‘规则ID’, CITY VARCHAR(64) comment ‘城市’, COMPANY_NAME VARCHAR(128) comment ‘企业名称’, SERVICE_ADDRESS VARCHAR(128) comment ‘上门地址’, EXP_DATE date comment ‘日期’, EXP_BEGIN_TIME time comment ‘开始时间’, EXP_END_TIME time comment ‘结束时间’, MASSAGIST_COUNT int(4) comment ‘技师数量’, STATUS VARCHAR(16) not null comment ‘状态:待分配、已分配、已确认、服务中、已完成、已取消’, OPERATOR varchar(30), CREATE_TIME datetime, MODIFY_TIME datetime, primary key (ID) );
全栈程序员站长
2022/09/06
1.2K0
mysql左连接去重
Mysql中外连接,内连接,左连接,右连接的区别
可能第一种通过where语句查询,大家都能理解. 但是不知道大家有没有去尝试过理解下面关于内连接与外连接查询方式的区别 ,接下来我们先通过一张图来演示一下连接的整个层级关系:
萌萌哒的瓤瓤
2021/01/13
4.6K0
Mysql中外连接,内连接,左连接,右连接的区别
SQL 内连接,外连接(左外连接、右外连接)
语句:select * from a_table a inner join b_table bon a.a_id = b.b_id;
birdskyws
2018/09/12
11.9K0
SQL 内连接,外连接(左外连接、右外连接)
Mysql—— 内连接、左连接、右连接以及全连接查询
语句:select * from a_table a inner join b_table b on a.a_id = b.b_id;
全栈程序员站长
2022/08/10
4.4K0
Mysql—— 内连接、左连接、右连接以及全连接查询
点击加载更多

相似问题

纪元和wireshark捕获

21

tcpdump / wireshark捕获问题

11

Wireshark捕获滤波器

13

wireshark:仅捕获数据层

35

Wireshark未捕获端口2000

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档