我使用bulbs来处理python中的neo4j操作。问题是当我尝试使用包含字典的属性创建节点时:
g.mynode.create(title='Mi Node', fields={'name': 'testNode'})
我最终收到以下错误:
*** SystemError: ({'status': '200', 'content-length': '109', 'content-encoding':
'UTF-8', 'server': 'Jetty(6.1.25)', 'access-control-allow-origin': '*', 'content-
type': 'application/json'}, '"java.lang.IllegalArgumentException:
Unknown property type on: {name=testNode}, class java.util.LinkedHashMap"')
答案 0 :(得分:0)
Neo4j不支持词典,它只支持包含原始类型的列表,如string,int,bool等(不允许在列表中使用混合类型)。
以下是Neo4j支持的属性类型:
http://docs.neo4j.org/chunked/preview/graphdb-neo4j-properties.html
要在Neo4j中存储字典,可以将其另存为JSON字符串。
灯泡有Document
Property
类型,可为您执行dict
< - > json
转换。
请参阅...
如果您使用通用Vertex
或Edge
,则需要在保存之前手动执行此转换:
type_system = g.client.type_system
fields = type_system.database.to_document({'name': 'testNode'})
g.mynode.create(title='Mi Node', fields=fields)
但是,如果您使用Model
,灯泡将为您进行转换。只需使用Document
属性而不是Dictionary
来定义模型:
# 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)
fields = 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)
>>> james = g.people.create(name="James", fields={'name': 'testNode1'})
>>> julie = g.people.create(name="Julie", fields={'name': 'testNode2'})
>>> knows = g.knows.create(james, julie)