如何通过JavaScript API向Neo4j插入完整对象(无需逐个指定属性)
解决Neo4j插入完整对象时的"Property values can only be of primitive types..."错误
这个问题我之前也碰到过,核心原因是你对象里的createdOn是JavaScript的Date对象——而Neo4j的属性值只支持**原始类型(字符串、数字、布尔、null)**或者它们的数组,复杂对象(比如JS的Date、自定义类实例)是没法直接赋值的。
下面给你两种可行的解决方案:
方案1:把Date转成ISO字符串后插入
先将对象里的Date类型转换为Neo4j能识别的ISO格式字符串,再整体赋值:
// 预处理对象,把Date转成ISO标准字符串 const processedData = { ...results.value, createdOn: results.value.createdOn.toISOString() }; // 执行插入操作 session.run(` UNWIND $obj as obj2 CREATE (p:Animals) SET p = obj2 RETURN p `, { obj: processedData })
插入后createdOn会以字符串形式存储,后续查询时如果需要日期类型,可以用Neo4j的datetime()函数转换。
方案2:插入原生Neo4j日期时间类型
如果你希望在Neo4j中存储原生的datetime类型,可以在Cypher里单独处理日期字段,其他属性保持整体赋值:
session.run(` UNWIND $obj as obj2 CREATE (p:Animals) // 先赋值所有原始类型属性,再单独转换日期字段 SET p = obj2, p.createdOn = datetime(obj2.createdOn) RETURN p `, { obj: { ...results.value, // 先把Date转成ISO字符串传给Cypher createdOn: results.value.createdOn.toISOString() } })
额外提醒
如果你的对象里还有其他复杂类型(比如嵌套对象、函数、自定义实例),也需要先把它们转换成原始类型或数组,否则都会触发同样的错误。
内容的提问来源于stack exchange,提问作者Sanka Darshana
相关产品推荐
相关产品推荐

