Neo4j:Can';t创建具有嵌套属性的节点
我到处找了,但找不到答案 我需要创建一个节点Neo4j:Can';t创建具有嵌套属性的节点,neo4j,cypher,Neo4j,Cypher,我到处找了,但找不到答案 我需要创建一个节点Config,该节点有一个带有2个键/值对的动态属性对象(例如,name和type)。查询时,键应以properties.name和properties.type结束。但是我似乎无法正确地使用create语法。这就是我正在做的: CREATE (c1:Config) set c1.properties=[{name:"CiPipelineConfig1"}, {type:"test"}] 但这给了我一些奇怪的错误: Neo.ClientError.S
Config
,该节点有一个带有2个键/值对的动态属性对象(例如,name
和type
)。查询时,键应以properties.name
和properties.type
结束。但是我似乎无法正确地使用create语法。这就是我正在做的:
CREATE (c1:Config) set c1.properties=[{name:"CiPipelineConfig1"}, {type:"test"}]
但这给了我一些奇怪的错误:
Neo.ClientError.Statement.TypeError: Neo4j only supports a subset of Cypher types for storage as singleton or array properties.
有人能帮我解决这个问题吗?Neo4j的集合有限
您应该将这些值存储为节点的属性,而不是将它们塞进一个属性中
// You need the `` around the property name to escape the period
CREATE (c1:Config) set c1.`properties.name`="CiPipelineConfig1" set c1.`properties.type`="test"
如果这对您来说还不够好,您需要将数据重新格式化为与Neo4j类型兼容的格式。Neo4j的设置有限
您应该将这些值存储为节点的属性,而不是将它们塞进一个属性中
// You need the `` around the property name to escape the period
CREATE (c1:Config) set c1.`properties.name`="CiPipelineConfig1" set c1.`properties.type`="test"
如果这对您来说不够好,您需要将数据重新格式化为与Neo4j类型兼容的格式。创建嵌套属性的一种方法是使用
JSON
属性作为字符串属性,您可以在写入时转储和编码数据,在读取时加载和解码python中的json属性就是一个例子 这是neomodel json属性的代码:
class JSONProperty(Property):
"""
Store a data structure as a JSON string.
The structure will be inflated when a node is retrieved.
"""
def __init__(self, *args, **kwargs):
super(JSONProperty, self).__init__(*args, **kwargs)
@validator
def inflate(self, value):
return json.loads(value)
@validator
def deflate(self, value):
return json.dumps(value)
创建嵌套属性的一种方法是使用
JSON
property作为字符串属性,您可以在写入时转储和编码数据,在读取时加载和解码python中的json属性就是一个例子 这是neomodel json属性的代码:
class JSONProperty(Property):
"""
Store a data structure as a JSON string.
The structure will be inflated when a node is retrieved.
"""
def __init__(self, *args, **kwargs):
super(JSONProperty, self).__init__(*args, **kwargs)
@validator
def inflate(self, value):
return json.loads(value)
@validator
def deflate(self, value):
return json.dumps(value)
请注意,不鼓励在Neo4j中存储JSON字符串,因为从技术上讲,它是blob数据,Neo4j无法高效地存储blob数据(大字符串)。所以从长远来看,这会降低你的分贝。但是,如果您的数据集很小,您可以不受影响。@Tezra为什么它会降低db?你有什么链接可以解释吗?从技术上讲,所有不打算用作文件存储的数据库都存在问题。因为它存储为blob,数据库无法有效地搜索该信息。(如果存储为字节数组,db根本无法对其进行搜索)因为这是一种效率较低的数据存储方式,需要更多的磁盘空间,而对于大数据,这些低效率将变得非常明显。尤其是查询数据时的RAM要求。(尤其是当您不能对数据库进行分片时)但由于数据对于这种格式的数据库来说是无用的,这是一个好迹象,您实际上需要磁盘上的配置文件来读取。仅供参考,如果您有一个long属性,并且为了简单起见,假设指针是long,那么这就是指向属性+32位值=64位的32位指针。字符为8位,因此64/8=4。最大长度为9223372036854775807,即19个字符。如果您的数据集足够小,就没有理由关心性能;你永远不会注意到这一点。但一旦开始扩展,字符串是一种效率极低的存储格式。属性名称/值越大,效率越低。我并不是说你不能这样做,如果你需要扩展,请记住这一点。请注意,不鼓励在Neo4j中存储JSON字符串,因为从技术上讲,它是blob数据,Neo4j不能有效地存储blob数据(大字符串)。所以从长远来看,这会降低你的分贝。但是,如果您的数据集很小,您可以不受影响。@Tezra为什么它会降低db?你有什么链接可以解释吗?从技术上讲,所有不打算用作文件存储的数据库都存在问题。因为它存储为blob,数据库无法有效地搜索该信息。(如果存储为字节数组,db根本无法对其进行搜索)因为这是一种效率较低的数据存储方式,需要更多的磁盘空间,而对于大数据,这些低效率将变得非常明显。尤其是查询数据时的RAM要求。(尤其是当您不能对数据库进行分片时)但由于数据对于这种格式的数据库来说是无用的,这是一个好迹象,您实际上需要磁盘上的配置文件来读取。仅供参考,如果您有一个long属性,并且为了简单起见,假设指针是long,那么这就是指向属性+32位值=64位的32位指针。字符为8位,因此64/8=4。最大长度为9223372036854775807,即19个字符。如果您的数据集足够小,就没有理由关心性能;你永远不会注意到这一点。但一旦开始扩展,字符串是一种效率极低的存储格式。属性名称/值越大,效率越低。我并不是说你不能做到这一点,只要记住,如果你需要扩大规模。