2016-01-13 87 views
1

我有跟的Neo4j和Python一個奇怪的問題,這似乎是與正在把數字輸入由Python接口py2neoNeo4j的Python接口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位之內,則返回錯誤的答案。

任何幫助表示讚賞。

這是蟒蛇2.7.6與2.3.1的Neo4j在Ubuntu 14.04lts

回答

1

這工作與py2neo添加數據:

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

如果你投的輸入漂浮在你的Python的原代碼的Cypher查詢工作(不toInt()):

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

我會假設,運行從控制檯的Cypher查詢和添加節點的Neo4j創建d不同的數據類型?

這個問題說明了什麼Neo4j的內部使用,整數存儲爲JAVA長:Cypher creates number as a long. How do I create an integer?

如果任何值> 32位的總和是正確的,但如果所有會內32位符合總和返回錯誤回答。

我對JAVA數據類型瞭解不多,但不應該太長時間總是64位?或者,也許1000000000存儲爲32位然後'sum()'中斷如果所有值都是32位?

+0

謝謝,鑄造到一個在Python中的浮動確實給出了期望的結果,但我希望避免必須使用浮點數,因爲所有數據都保證爲整數。 它絕對看起來像一個bug,我認爲它必須是一個neo4j問題,總和不應該被限制爲32位整數算術。雖然可以做py2neo應該插入一切的情況很長的情況下... –

+0

到目前爲止,我認爲每個整數實際上是作爲一個長期添加。也許問題出在求和函數中? –

+0

看起來這可能是一個錯誤,據報道: - https://github.com/neo4j/neo4j/issues/4450 –