我现在正在尝试将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
函数,但不确定语法是什么。
关于如何实现这一目标的任何想法?问题是我有一个元组列表吗?
谢谢!
==============更新==============
根据彼得的建议,我尝试使用简单的平面列表并遇到同样的错误:
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 :(得分:4)
Neo4j仅支持包含基本类型的列表,例如string
,int
,bool
等(不允许列表中的混合类型)。
以下是Neo4j支持的属性类型:
http://docs.neo4j.org/chunked/preview/graphdb-neo4j-properties.html
要在Neo4j中存储混合类型list
,您可以将其另存为JSON文档字符串。
灯泡有Document
Property
类型,可为您执行dict
< - > json
转换。
请参阅...
如果您使用通用Vertex
或Edge
,则需要在保存之前手动执行此转换:
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()