将对象数组作为属性插入neo4j

时间:2016-10-25 10:03:59

标签: arrays neo4j query-performance

我正在尝试将对象数组作为属性插入到节点。我试过了

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无法支持“嵌套属性值”

如何达到我的要求?

3 个答案:

答案 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_idsnl_statuses值具有相同的索引。

除此之外:由于您的ON MATCH SET ...ON CREATE SET ...行为完全相同,我只是将它们合并为一个SET ...条款。