代码之家  ›  专栏  ›  技术社区  ›  Michael Ramos

密码插入查询Neo4J

  •  0
  • Michael Ramos  · 技术社区  · 9 年前

    假设我有一个相当大的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)
    

    因此,如果此语句运行两次,则会创建两次兴趣节点,这是不需要的行为。

    1 回复  |  直到 9 年前
        1
  •  1
  •   William Lyon    9 年前

    您可以将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部分 this blog post 了解更多详细信息。