簡體   English   中英

Neo4j Python界面py2neo和數據輸入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM