Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j:Can';t创建具有嵌套属性的节点_Neo4j_Cypher - Fatal编程技术网

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个字符。如果您的数据集足够小,就没有理由关心性能;你永远不会注意到这一点。但一旦开始扩展,字符串是一种效率极低的存储格式。属性名称/值越大,效率越低。我并不是说你不能做到这一点,只要记住,如果你需要扩大规模。