如何用Neo4j APOC解析JSON获取数组最后元素并优化Cypher语句
解决嵌套JSON中取xpath数组最后一个元素关联label的问题
我明白你的需求啦——你现在需要从JSON里每个origin项的xpath数组中取出最后一个元素,只和对应的label节点创建关联,而不是原来那样关联所有xpath元素。之前用apoc.agg.last(or.xpath)没得到预期结果,是因为用错了函数哦,我来给你梳理下解决方案:
问题根源
apoc.agg.last()是聚合函数,用来在分组查询中获取某组记录的最后一条值;而你需要的是获取单个数组的最后一个元素,这时候应该用集合处理函数apoc.coll.last()。
修改后的Cypher代码
直接替换原来处理xpath的部分,用下面的代码即可:
WITH "file:///D:/project/neo_proj/input.json" AS url CALL apoc.load.json(url) YIELD value UNWIND value.origin as or MERGE(label:concept{name:or.label}) ON CREATE SET label.type = or.type // 处理tag的逻辑保持不变 FOREACH(tagName IN or.tag | MERGE(tag:concept{name:tagName}) MERGE (tag)-[r:link]-(label) ON CREATE SET r.Weight=1 ON MATCH SET r.Weight=r.Weight+1 ) // 仅关联xpath数组的最后一个元素 FOREACH(lastXpath IN CASE WHEN size(or.xpath) > 0 THEN [apoc.coll.last(or.xpath)] ELSE [] END | MERGE (xpath:concept{name:lastXpath}) MERGE (label)-[r:link]-(xpath) )
代码说明
apoc.coll.last(or.xpath):精准获取当前origin项的xpath数组最后一个元素;- CASE判断+单元素数组:通过
CASE判断xpath数组是否为空,为空则返回空数组(FOREACH不会执行),非空则把最后一个元素包装成单元素数组,让FOREACH只执行一次; - 保留了你原来处理
tag的逻辑,确保其他功能不受影响。
这个查询可以直接在你的应用中调用执行,不需要依赖Neo4j浏览器,只要你的应用能正常连接Neo4j并执行Cypher语句就行。
内容的提问来源于stack exchange,提问作者Artem Nazarenko
相关产品推荐
相关产品推荐

