[英]Neo4j python interface py2neo & data typing
我對neo4j和python有一個好奇的問題,它似乎與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()限制為32bit一致。
如果任何值> 32bit,則總和是正確的,但如果所有值都適合32位以內,則總和將返回錯誤的答案。
任何幫助表示贊賞。
這是ubuntu 14.04lts上帶有neo4j 2.3.1的python 2.7.6
這適用於您添加了py2neo的數據:
match (n)-[r]->(n2) return n,sum(toInt(r.value)),n2;
而且,如果將輸入toInt()
為浮動在Python代碼中,則原始Cypher查詢有效(不使用toInt()
):
...
r = Relationship.cast(foo1, 'NUMBER', foo2, { 'name': 'foo%d' % i, 'value': float(1000000000) } )
...
我會假設從控制台運行Cypher查詢並從neo4j添加節點會創建不同的數據類型嗎?
這個問題解釋了neo4j內部使用的是什么,整數存儲為JAVA long: Cypher創建數字為long。 如何創建整數?
如果任何值> 32bit,則總和是正確的,但如果所有值都適合32位以內,則總和將返回錯誤的答案。
我對JAVA數據類型了解不多,但是不應該總是64位嗎? 還是將1000000000
存儲為32位,然后如果所有值均為32位,則“ sum()”會中斷嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.