【问题标题】:Cypher Insert Querying Neo4J密码插入查询 Neo4J
【发布时间】:2016-03-27 13:25:45
【问题描述】:

假设我有一个相当大的 JSON 对象。该对象可以以多种方式嵌套并包含数组。该对象为我提供了一个用户以及他们与一个类型的单个对象和一个类型的多个(数组)对象的关系。

我的目标是尽可能快速高效地将其插入 Neo4j。

这是否可以在一个查询中完成,是否建议这样做,该查询是通过迭代 JSON 结构创建的串联字符串? (解析对象并抽象成多个节点和关系)

还有一个让我觉得这个过程很困难的常见问题: 对于我正在迭代的数组,当我连接 MERGE 语句时,Neo4J 中的节点会重复,并且合并似乎不起作用。

//Person to interests
_.each(interests, function(itr){
    ingestQuery += 'MERGE(centerRep)-[:INTERESTED_IN]->(:Interest{name: "'+itr.interest_name+'", category: "'+itr.interest_category+'"})'
},this)

因此,如果此语句运行两次,兴趣节点将被创建两次,这是不受欢迎的行为。

【问题讨论】:

  • "这是否可以在一个查询中完成,是否建议这样做,该查询是通过迭代 JSON 结构创建的连接字符串?" - 不知道你是什么再问:你想在 Neo4j 中存储一个大字符串?您想将 JSON 格式的字符串解析为多个节点吗?你想建立一个进口商?请编辑您的问题以澄清。
  • 另外:您还有一个问题(关于合并),您应该考虑单独提出。
  • 已编辑,如果它足够简单,可以在这里回答,请这样做,对我来说,这是我的问题的一部分(尝试用一个查询做所有事情而不是把它分成多个)

标签: neo4j cypher


【解决方案1】:

您可以将 JSON 作为参数传递给 Cypher 查询,并使用 UNWIND 遍历 JSON 中的数组。

例如(取自this blog post),假设您的 JSON 如下所示:

{ "items": [{
"question_id": 24620768,
"link": "http://stackoverflow.com/questions/24620768/neo4j-cypher-query-get-last-n-elements",
"title": "Neo4j cypher query: get last N elements",
"answer_count": 1,
"score": 1,
.....
"creation_date": 1404771217,
"body_markdown": "I have a graph....How can I do that?",
"tags": ["neo4j", "cypher"],
"owner": {
    "reputation": 815,
    "user_id": 1212067,
    ....
    "link": "http://stackoverflow.com/users/1212067/"
},
"answers": [{
    "owner": {
        "reputation": 488,
        "user_id": 737080,
        "display_name": "Chris Leishman",
        ....
    },
    "answer_id": 24620959,
    "share_link": "http://stackoverflow.com/a/24620959",
    ....
    "body_markdown": "The simplest would be to use an ... some discussion on this here:...",
    "title": "Neo4j cypher query: get last N elements"
}]
}

将此 JSON 对象作为参数传递给 Cypher 查询以将其插入到图表中,如下所示:

WITH {json} as data
UNWIND data.items as q
MERGE (question:Question {id:q.question_id}) ON CREATE
  SET question.title = q.title, question.share_link = q.share_link, question.favorite_count = q.favorite_count
MERGE (owner:User {id:q.owner.user_id}) ON CREATE SET owner.display_name = q.owner.display_name
MERGE (owner)-[:ASKED]->(question)
FOREACH (tagName IN q.tags | MERGE (tag:Tag {name:tagName}) MERGE (question)-[:TAGGED]->(tag))
FOREACH (a IN q.answers |
MERGE (question)<-[:ANSWERS]-(answer:Answer {id:a.answer_id})
MERGE (answerer:User {id:a.owner.user_id}) ON CREATE SET answerer.display_name = a.owner.display_name
MERGE (answer)<-[:PROVIDED]-(answerer))

here 和 here 还有几个例子。

关于您的 MERGE 问题。 MERGE 查看整个模式,并将根据指定的整个模式“获取或创建”。通常您想要的是在单个节点属性上进行 MERGE,以确保该节点不重复而不是更大的模式。查看 this blog post 的 MERGE 部分了解更多详情。

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多