我正在尝试将对象数组作为属性插入到节点。我试过了
MERGE (ss:Label1 {sId: 12345})
ON MATCH SET ss.id = 14770746012, ss.setC = 1,ss.nl = [{id: 24, status: 0}]
ON CREATE SET ss.id = 14770746012, ss.setC = 1,ss.nl = [{id: 24, status: 0}]
如果运行我会得到以下错误::
Property values can only be of primitive types or arrays thereof
甚至我尝试使用嵌套数组,这给了我与上面相同的错误。
我在Neo4j文档中研究过Neo4j无法支持“嵌套属性值”
如何达到我的要求?
答案 0 :(得分:3)
由于Neo4j不支持分层属性,解决此问题的方法之一 - 创建其他节点:
MERGE (ss:Label1 {sId: 12345, id: 14770746012, setC: 1 })
MERGE (nl:Props:nlProp {id: 24, status: 0})
MERGE (ss)-[:hasProps]->(nl)
答案 1 :(得分:3)
如stdob--所述,如果需要在查询中使用这些属性(用于过滤,聚合等),则可以创建其他节点。
但是,如果您只想编写和读取数据但不在查询中对其进行操作,则可以将其序列化,例如以JSON:
MERGE (ss:Label1 {sId: 12345})
ON MATCH SET ss.id = 14770746012, ss.setC = 1,ss.nl = ["{\"id\": 24, \"status\": 0}"]
ON CREATE SET ss.id = 14770746012, ss.setC = 1,ss.nl = ["{\"id\": 24, \"status\": 0}"]
答案 2 :(得分:0)
另一种选择是将nl
集合拆分为每个元素属性的单独集合。例如:
MERGE (ss:Label1 {sId: 12345})
SET ss.id = 14770746012, ss.setC = 1, ss.nl_ids = [24], ss.nl_statuses: [0];
对应的nl_ids
和nl_statuses
值具有相同的索引。
除此之外:由于您的ON MATCH SET ...
和ON CREATE SET ...
行为完全相同,我只是将它们合并为一个SET ...
条款。