Создание отношений между идентификаторами и идентификаторами во вложенных списках с использованием APOC - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь представить данные MongoDB в виде графика в Neo4J, используя соединитель APO C, но я не могу обернуть голову вокруг правильного синтаксиса. Мои данные в mongodb выглядят так:

{
"_id" : ObjectId("5e88985f788e2ab63ff926d7"),
"role": "member",
"name": "Emmett Brown",
"dob" : "1955-03-19",
"registration_date" : "1985-10-26",
"follows" : []
},
{
"_id" : ObjectId("5e88985f788e2ab63ff926d8"),
"role": "member",
"name": "Marty McFly",
"dob" : "1968-06-09",
"registration_date" : "2015-10-26",
"follows": [{
    "id" : [ObjectId("5e88985f788e2ab63ff926d7")]
}]
},
{
"_id" : ObjectId("5e88985f788e2ab63ff926d9"),
"role": "member",
"name": "Biff Tannen",
"dob" : "1959-04-15",
"registration_date" : "2006-09-15",
"follows": [{
        "id" : [ObjectId("5e88985f788e2ab63ff926d7"), ObjectId("5e88985f788e2ab63ff926d8")]
    }]
}

Я хотел бы создать в Neo4J график, который бы выглядел так:

CREATE (Emmett:Person)
CREATE (Marty:Person)
CREATE (Biff:Person)

CREATE
(Marty)-[:FOLLOWS]->(Emmett),
(Biff)-[:FOLLOWS]->(Emmett),
(Biff)-[:FOLLOWS]->(Marty)

Другими словами я хотел бы использовать каждый ObjectId в ключе «follow» в качестве узла назначения. Однако, так как я использую идентификаторы, я не имею представления о том, как создавать свои отношения ... Вот что я придумал до сих пор:

CALL apoc.mongodb.get('mongodb://localhost:27017', 'database_name', 'user_collection', {}) YIELD value AS person
MERGE (p:Person {name:person.name}) ON CREATE SET p.registration_date = person.registration_date
RETURN p

Это позволяет мне вернуть все мои узлы и отображать их в Neo4J, но я пытался получить значения своих узлов в течение последних 2 дней, и я просто не могу это сделать ... Поэтому я подумал, что, возможно, кто-нибудь из вас может помочь с этим ? Заранее спасибо!

1 Ответ

1 голос
/ 06 апреля 2020

У меня нет экземпляра Mon go, с которым можно было бы поиграть, поэтому я смоделировал это с файлом JSON - обратите внимание, что я собрал биты ObjectId в просто строки, которые, как мне кажется, Neo4j обрабатывает. Вам нужно заменить первую строку своим вызовом на apoc.mongodb.get

[{
    "_id" : "5e88985f788e2ab63ff926d7",
    "role": "member",
    "name": "Emmett Brown",
    "dob" : "1955-03-19",
    "registration_date" : "1985-10-26",
    "follows" : []
    },
    {
    "_id" : "5e88985f788e2ab63ff926d8",
    "role": "member",
    "name": "Marty McFly",
    "dob" : "1968-06-09",
    "registration_date" : "2015-10-26",
    "follows": [{
        "id" : ["5e88985f788e2ab63ff926d7"]
    }]
    },
    {
    "_id" : "5e88985f788e2ab63ff926d9",
    "role": "member",
    "name": "Biff Tannen",
    "dob" : "1959-04-15",
    "registration_date" : "2006-09-15",
    "follows": [{
            "id" : ["5e88985f788e2ab63ff926d7", "5e88985f788e2ab63ff926d8"]
        }]
    }
]

. Следующее создает узлы People, а затем запускает второй проход, который пытается соединить их вместе:

CALL apoc.load.json("example.json") YIELD value as person
WITH collect(person) as people
FOREACH (personDetails in people | 
    MERGE (p: Person { id: personDetails._id }) 
    ON CREATE SET p.registrationDate = personDetails.registrationDate,
                  p.name = personDetails.name

)
WITH people
UNWIND people as personDetails
MATCH (follower: Person { id: personDetails._id })
UNWIND personDetails.follows as followsRecords
MATCH (followed: Person) WHERE followed.id in followsRecords.id
MERGE (follower)-[:FOLLOWS]->(followed)

enter image description here

Возможно, мы также хотим создать уникальное ограничение для Person.id, которое ускорит работу с большими наборами данных, а также предотвратит странные проблемы с данными в случае, если мы получим наш запрос неверен:

CREATE CONSTRAINT ON (p:Person) ASSERT p.id IS UNIQUE

...