2013-09-26 38 views
4

我正在使用Bulbflow通過python訪問Neo4jBulbflow - 如何將列表/字典保存爲屬性

我現在試圖保存一個Python列表作爲一個節點屬性,但我一直遇到錯誤。從documentation,我可以看到,在模型中定義當列表是一個公認的類型,但我想保存列表屬性模型定義後,即

anode = g.vertices.get(123) 
anode.specs = [(2, 0.27911702036756064), (5, 0.6708785014712791)] 
anode.save() 

但我得到以下錯誤:

SystemError: (
    {'status': '200', 
    'content-length': '142', 
    'content-type': 'application/json; charset=UTF-8', 
    'access-control-allow-origin': '*', 
    'server': 'Jetty(6.1.25)'}, 
    '"java.lang.IllegalArgumentException: 
     Unknown property type on: [[2, 0.27911702036756064], [5, 0.6708785014712791]], 
     class java.util.ArrayList"') 

我試過使用convert_to_db函數,但不確定語法是什麼。

有關如何實現此目的的任何想法?問題是我有一個元組列表?

謝謝!

============== UPDATE ==============

繼彼得的建議,我試圖用一個簡單的平面列表相同並遇到同樣的錯誤:

SystemError: (
    {'status': '200', 
    'content-length': '172', 
    'content-type': 'application/json; charset=UTF-8', 
    'access-control-allow-origin': '*', 
    'server': 'Jetty(6.1.25)'}, 
    '"java.lang.IllegalArgumentException: 
     Unknown property type on: [0.0, 0.0, 0.0, 0.42659109777029425, 0.0, 0.0, 0.0, 0.0, 0.5234052770685714, 0.0], 
     class java.util.ArrayList"') 

任何想法?

+0

這是一個嵌套的數組,也許你可以將此轉換爲字符串,多頭簡單數組或者整形自己嗎? –

+0

@PeterNeubauer我不幸遇到了一個簡單的平面列表相同的錯誤。 – zanbri

回答

4

Neo4j僅支持包含原始類型的列表,例如string,int,bool等(列表中的混合類型是不允許的)。

以下是屬性類型Neo4j的支持:

http://docs.neo4j.org/chunked/preview/graphdb-neo4j-properties.html

要存儲混合型list在Neo4j的,可以將其保存爲一個文件JSON字符串。

燈泡有DocumentProperty型,做了dict < - >json轉換爲您服務。

看看...

如果與通用VertexEdge工作,你需要手動做這種轉換在保存之前:

specs = [(2, 0.27911702036756064), (5, 0.6708785014712791)] 
anode = g.vertices.get(123) 
anode.specs = g.client.type_system.database.to_document(specs) 
anode.save() 

但是,如果您使用的是Model,燈泡會爲您進行轉換。簡單地使用Document屬性,而不是List定義你的模型:

# people.py 

from bulbs.model import Node, Relationship 
from bulbs.property import String, DateTime, Document 
from bulbs.utils import current_datetime 

    class Person(Node): 

     element_type = "person" 

     name = String(nullable=False) 
     specs = Document() 

    class Knows(Relationship): 

     label = "knows" 

     timestamp = DateTime(default=current_datetime, nullable=False) 

...然後你可以使用你的模型是這樣的...

>>> from people import Person, Knows 
>>> from bulbs.neo4jserver import Graph 

>>> g = Graph() 
>>> g.add_proxy("people", Person) 
>>> g.add_proxy("knows", Knows) 

>>> specs = [(2, 0.27911702036756064), (5, 0.6708785014712791)] 

# You can save specs when you create it... 
>>> james = g.people.create(name="James", specs=specs) 

# ...or save it after creation... 
>>> julie = g.people.create(name="Julie") 
>>> julie.specs = specs 
>>> julie.save() 

http://bulbflow.com/docs/api/bulbs/model/

+1

這對我非常有幫助。你真的創造了很棒的軟件!謝謝!! – zanbri

相關問題