如何在neo4j中加载json并提取到单独的节点中

如何在neo4j中加载json并提取到单独的节点中,json,neo4j,load,Json,Neo4j,Load,我是neo4j的新手,我的案子需要帮助。。。 我正在尝试加载json文件,其结构如下(由建议更新),并将其解压缩到3个节点(big5_personality、personality_result和personality) 我尝试使用这个命令,并成功地创建了一个名为big5_personality的节点,但遇到了另外两个节点 WITH "///big5_personality.json" AS file call apoc.load.json(file) YIELD value

我是neo4j的新手,我的案子需要帮助。。。 我正在尝试加载json文件,其结构如下(由建议更新),并将其解压缩到3个节点(big5_personality、personality_result和personality)

我尝试使用这个命令,并成功地创建了一个名为big5_personality的节点,但遇到了另外两个节点

WITH "///big5_personality.json" AS file
call apoc.load.json(file) YIELD value
unwind value.big5_personality as item
merge (a:big5_personality{user_name_link: item.user_name_link})
on create set
a.user_name = item.user_name,
a.preference = item.preferance,
a.gender = item.gender,
a.marital_status = item.marital_status,
a.education = item.education,
a.age_range = item.age_range,
a.location = item.location,
a.user_likes = item.user_likes,
a.post_text_id = item.post_text_id,
a.post_text_eng = item.post_text_eng,
a.identity = item.identity

foreach (personality_result in item.personality_result |
merge (b:personality_result {user_name_link: item.user_name_link})
on create set 
b.word_count = personality_result.word_count,
b.word_count_message = personality_result.word_count_message,
b.processed_language = personality_result.processed_language
) 
merge (a)-[r1:rel_personality_result]->(b)

foreach (personality in item.personality_result.personality |
merge (c:personality {user_name_link: b.user_name_link})
on create set 
c.trait_id = personality.trait_id
MERGE (b)<-[:rel_personality]-(c)
)
以“//big5_personality.json”作为文件
调用apoc.load.json(文件)产生值
将value.big5_个性作为项目展开
合并(a:big5_personality{user_name_link:item.user_name_link})
关于创建集
a、 user\u name=item.user\u name,
a、 首选项=项。首选项,
a、 性别=项目。性别,
a、 婚姻状况=项。婚姻状况,
a、 教育=项目。教育,
a、 年龄范围=项目。年龄范围,
a、 位置=项目位置,
a、 user\u likes=item.user\u likes,
a、 post\u text\u id=item.post\u text\u id,
a、 post_text_eng=item.post_text_eng,
a、 identity=item.identity
foreach(项目中的个性结果。个性结果|
合并(b:personality\u result{user\u name\u link:item.user\u name\u link})
关于创建集
b、 单词计数=个性结果。单词计数,
b、 word\u count\u message=个性结果。word\u count\u message,
b、 已处理语言=个性结果。已处理语言
) 
合并(a)-[r1:rel_personality_result]->(b)
foreach(项目个性\结果个性中的个性)|
合并(c:personality{user\u name\u link:b.user\u name\u link})
关于创建集
c、 trait\u id=personality.trait\u id

合并(b)您的数据文件存在多个问题。其中包括:

  • 您的Cypher代码期望
    personality\u result
    是JSON对象的列表,但事实并非如此

    (a) 它是单个字符串,而不是列表

    (b) 该字符串似乎由一个字符串化的JSON对象的截断开头组成(该对象包含大量额外的漂亮打印空白)

    因此,从
    FOREACH
    开始的Cypher查询中的所有内容都将不起作用

  • 在下一个倒数第二个
    合并
    中,
    个性\u结果。个性
    可能只是
    个性


  • 您可能还有其他问题,但在您修复数据文件和代码之前很难判断。

    我找到了解决问题的方法…也许这是一种肮脏的方式,并且有更好的解决方案来解决我的问题…更新的代码如下:

    WITH "///big5_personality.json" AS file
    call apoc.load.json(file) YIELD value
    unwind value.big5_personality as item
    unwind item.personality_result as itema
    unwind itema.personality_detail as itemb
    UNWIND itemb.children as itemc
    merge (a:big5_personality{user_name_link: item.user_name_link})
    on create set
    a.user_name = item.user_name,
    a.preference = item.preferance,
    a.gender = item.gender,
    a.marital_status = item.marital_status,
    a.education = item.education,
    a.age_range = item.age_range,
    a.location = item.location,
    a.user_likes = item.user_likes,
    a.post_text_id = item.post_text_id,
    a.post_text_eng = item.post_text_eng,
    a.identity = item.identity
    
    foreach (personality_result in itema |
    merge (b:personality_result {user_name_link: item.user_name_link})
    on create set 
    b.word_count = personality_result.word_count,
    b.word_count_message = personality_result.word_count_message,
    b.processed_language = personality_result.processed_language
    ) 
    merge (a)-[r1:rel_big5_personality_result{user_name_link: a.user_name_link, word_count: itema.word_count, word_count_message: itema.word_count_message, processed_language: itema.processed_language}]->(b)
    
    foreach (trait in itemb |
    merge (c:personality{user_name_link : item.user_name_link, trait_id: trait.trait_id, trait_name: trait.name, trait_category: trait.category, trait_percentile: trait.percentile,  trait_significant: trait.significant})
    ON CREATE SET
    c.trait_raw_score = trait.raw_score
    MERGE (b)-[:rel_personality_result{user_name_link : itema.user_name_link, trait_id: itemb.trait_id, trait_name: itemb.name, trait_category: itemb.category, trait_percentile: itemb.percentile, trait_significant: itemb.significant}]->(c)
    )
    
    FOREACH (facet IN itemc |
    MERGE (d:personality_children{user_name_link : itema.user_name_link, personality_trait_id: itemb.trait_id})
    ON CREATE SET
    d.facet_trait_id = facet.trait_id,
    d.facet_name = facet.name,
    d.facet_category = facet.category,
    d.facet_percentile = facet.percentile,
    d.facet_significant = facet.significant
    MERGE (c)-[:rel_personality_children{user_name_link : itema.user_name_link, personality_trait_id: itemb.trait_id, facet_trait_id: itemc.trait_id, facet_name: itemc.name, facet_category: itemc.category, facet_percentile: itemc.percentile, facet_significant: itemc.significant}]->(d)
    )
    

    感谢您的快速回复@cybersam,我将尝试先修复数据,然后更新JSON和cypher,请帮助我…当我运行查询时,然后引发错误类型不匹配:预期为映射,但为列表hi,我已找到解决方案。通过添加unwind item.personality\u结果作为itema unwind itema.personality作为itemb在行unwind value.big5\u p之后personality as item.但仅为personality label创建了4个节点。使用“//big5_personality.json”作为文件调用apoc.load.json(文件)生成值unwind value.big5_personality as item unwind item.personality_result as item a unwind item a.personality as item b返回不同的item b.name,有5条记录(“开放性”“认真性”“外向性”“宜人性”“情感范围”)应该创建20个记录,有什么建议吗?在你更新的数据文件
    personality
    中只有5个元素,而不是20个。是的,我的错,只有5个…但仍然只有1个元素创建而不是5个…你能告诉我我我的命令有什么问题吗
    WITH "///big5_personality.json" AS file
    call apoc.load.json(file) YIELD value
    unwind value.big5_personality as item
    unwind item.personality_result as itema
    unwind itema.personality_detail as itemb
    UNWIND itemb.children as itemc
    merge (a:big5_personality{user_name_link: item.user_name_link})
    on create set
    a.user_name = item.user_name,
    a.preference = item.preferance,
    a.gender = item.gender,
    a.marital_status = item.marital_status,
    a.education = item.education,
    a.age_range = item.age_range,
    a.location = item.location,
    a.user_likes = item.user_likes,
    a.post_text_id = item.post_text_id,
    a.post_text_eng = item.post_text_eng,
    a.identity = item.identity
    
    foreach (personality_result in itema |
    merge (b:personality_result {user_name_link: item.user_name_link})
    on create set 
    b.word_count = personality_result.word_count,
    b.word_count_message = personality_result.word_count_message,
    b.processed_language = personality_result.processed_language
    ) 
    merge (a)-[r1:rel_big5_personality_result{user_name_link: a.user_name_link, word_count: itema.word_count, word_count_message: itema.word_count_message, processed_language: itema.processed_language}]->(b)
    
    foreach (trait in itemb |
    merge (c:personality{user_name_link : item.user_name_link, trait_id: trait.trait_id, trait_name: trait.name, trait_category: trait.category, trait_percentile: trait.percentile,  trait_significant: trait.significant})
    ON CREATE SET
    c.trait_raw_score = trait.raw_score
    MERGE (b)-[:rel_personality_result{user_name_link : itema.user_name_link, trait_id: itemb.trait_id, trait_name: itemb.name, trait_category: itemb.category, trait_percentile: itemb.percentile, trait_significant: itemb.significant}]->(c)
    )
    
    FOREACH (facet IN itemc |
    MERGE (d:personality_children{user_name_link : itema.user_name_link, personality_trait_id: itemb.trait_id})
    ON CREATE SET
    d.facet_trait_id = facet.trait_id,
    d.facet_name = facet.name,
    d.facet_category = facet.category,
    d.facet_percentile = facet.percentile,
    d.facet_significant = facet.significant
    MERGE (c)-[:rel_personality_children{user_name_link : itema.user_name_link, personality_trait_id: itemb.trait_id, facet_trait_id: itemc.trait_id, facet_name: itemc.name, facet_category: itemc.category, facet_percentile: itemc.percentile, facet_significant: itemc.significant}]->(d)
    )