gpt4 book ai didi

python - Neo4j python 接口(interface) py2neo 和数据输入

转载 作者:太空宇宙 更新时间:2023-11-03 17:03:53 24 4
gpt4 key购买 nike

我对 neo4j 和 python 遇到了一个奇怪的问题,它似乎与 python 接口(interface) py2neo 输入的数字有关

如果我使用 cypher 命令创建一个简单的数据库:-

create (n:Type {name:"foo1"});
create (n:Type {name:"foo2"});
match (n:Type {name:"foo1"}), (n2:Type {name:"foo2"})
create (n)-[r:NUMBER {name: "flow1", value: 1000000000}]->(n2),
(n)-[:NUMBER {name: "flow2", value: 1000000000}]->(n2),
(n)-[:NUMBER {name: "flow3", value: 1000000000}]->(n2),
(n)-[:NUMBER {name: "flow4", value: 1000000000}]->(n2),
(n)-[:NUMBER {name: "flow5", value: 1000000000}]->(n2),
(n)-[:NUMBER {name: "flow6", value: 1000000000}]->(n2),
(n)-[:NUMBER {name: "flow7", value: 1000000000}]->(n2),
(n)-[:NUMBER {name: "flow8", value: 1000000000}]->(n2),
(n)-[:NUMBER {name: "flow9", value: 1000000000}]->(n2);

并运行聚合查询来对关系的值求和:-

match (n)-[r]->(n2) return n,sum(r.value),n2;

我得到了预期的结果:-

+--------------------------------------------------------------------+
| n | sum(r.value) | n2 |
+--------------------------------------------------------------------+
| Node[20103]{name:"foo1"} | 9000000000 | Node[20104]{name:"foo2"} |
+--------------------------------------------------------------------+

但是,如果我使用此 python 脚本填充相同的数据集:-

#!/usr/bin/python

from py2neo import Graph, Path, Node, authenticate, Relationship

authenticate("localhost:7474", "neo4j", "password")

graph = Graph()


foo1 = Node('Type', name='foo1')
foo2 = Node('Type', name='foo2')

graph.create(foo1)
graph.create(foo2)

for i in range(1,10):
r = Relationship.cast(foo1, 'NUMBER', foo2, { 'name': 'foo%d' % i, 'value': 1000000000 } )
graph.create_unique(r)

然后运行相同的查询,我得到了有点令人惊讶的结果:-

neo4j-sh (?)$  match (n)-[r]->(n2) return n,sum(r.value),n2;
+--------------------------------------------------------------------+
| n | sum(r.value) | n2 |
+--------------------------------------------------------------------+
| Node[20105]{name:"foo1"} | 410065408 | Node[20106]{name:"foo2"} |
+--------------------------------------------------------------------+

这与 sum() 被限制为 32 位是一致的。

如果任何值 >32 位,则总和是正确的,但如果所有值都适合 32 位,则总和将返回错误的答案。

感谢任何帮助。

这是 ubuntu 14.04lts 上的 python 2.7.6 和 neo4j 2.3.1

最佳答案

这适用于使用 py2neo 添加的数据:

match (n)-[r]->(n2) return n,sum(toInt(r.value)),n2;

如果您在 Python 代码中将输入转换为 float,则原始 Cypher 查询将起作用(无需 toInt()):

...
r = Relationship.cast(foo1, 'NUMBER', foo2, { 'name': 'foo%d' % i, 'value': float(1000000000) } )
...

我假设从控制台运行 Cypher 查询并从 neo4j 添加节点会创建不同的数据类型?

这个问题解释了neo4j内部使用的内容,整数存储为JAVA long:Cypher creates number as a long. How do I create an integer?

If any value is >32bit the sum is correct, but if all would fit within 32 bits the sum returns the wrong answer.

我不太了解JAVA数据类型,但是long不应该总是64位吗?或者也许 1000000000 存储为 32 位,然后如果所有值都是 32 位,“sum()”就会中断?

关于python - Neo4j python 接口(interface) py2neo 和数据输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34766182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com