Есть ли способ динамически генерировать узлы из JSON с помощью процедуры apoc.load.json? - PullRequest
0 голосов
/ 23 октября 2019

Я хотел бы создать набор узлов и отношений из документа JSON. Вот пример JSON:

{"records": [{
    "type": "bundle",
    "id": "bundle--1",
    "objects": [
        {
            "type": "evaluation",
            "id": "evaluation--12345",
            "name": "Eval 1",
            "goals": [
                "test"
            ]
        },
        {
            "type": "subject",
            "id": "subject--67890",
            "name": "Eval 2",
            "goals": [
                "execute"
            ]
        },
        {
            "type": "relationship",
            "id": "relationship--45678",
            "relationship_type": "participated-in",
            "source_ref": "subject--67890",
            "target_ref": "evaluation--12345"
        }
    }]
}

И я хотел бы, чтобы этот JSON был представлен в Neo, как показано ниже:

(:evaluation {properties})<-[:RELATIONSHIP]-(:subject {properties})

В конечном счете, я хотел бы иметь модель, которая представляетоценка, субъект и отношения, генерируемые с помощью нескольких шифровальных вызовов с минимальными внешними манипуляциями, насколько это возможно. Можно ли использовать набор вызовов apoc.create. * Для создания необходимых узлов и связей из этого JSON? Я пробовал что-то похожее на следующее, чтобы загрузить этот JSON, и я могу заставить его создавать узлы произвольного, в данном случае типа «объект».

WITH "file:///C:/path/to/my/sample.json" AS json
CALL apoc.load.json(json, "$.records") YIELD value
UNWIND value.objects as object
MERGE (o:object {id: object.id, type: object.type, name: object.name})
RETURN count(*)

Я пытался изменить выражение JSONPath для фильтрации разных типов записей, но сложно запустить путь Гесснера, например $.records..objects[?(@.type = 'subject')], благодаря встроенным кавычкам. Это также привело бы к нескольким прогонам (у меня 15 или около того разных типов) против реального JSON, что может занять очень много времени. Документы LoadJSON имеют простое выражение фильтра, а в блоге 1014 * показано, как анализировать стек-поток, но объекты JSON имеют ключ, который легко отображать в шифре. Есть ли шифр-трюк или APOC, о которых я должен знать, что может помочь мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Как указывал Лю, функцию apoc.do.case можно использовать для создания набора проверяемых условий, за которым следует оператор шифрования. Объединение этого с другим вызовом apoc требует правильной обработки возвратов от каждого вызова apoc. Мой ответ в итоге выглядел следующим образом:

WITH "file:///C:/path/to/my/sample.json" AS json
CALL apoc.load.json(json, "$.records") YIELD value as records
UNWIND records.objects as object
CALL apoc.do.case(
    [object.type="evaluation", "MERGE (:Evaluation {id: object.id}) ON CREATE SET Evaluation.id = object.id, Evaluation.prop1 = object.prop1",
    object.type="subject", "MERGE (:Subject {id: object.id}) ON CREATE SET Subject.id = object.id, Subject.prop1 = object.prop1",
    ....]
"<default case cypher query goes here>", {object:object}
)
YIELD value RETURN count(*)

Обратите внимание, что есть два вызова apoc, которые YIELD. Используйте псевдонимы, чтобы помочь анализатору различать объекты. Документация для apoc.do.case немного скудна, но описывает синтаксис оператора. Похоже, что есть другие способы выполнить эту задачу, но с меньшими файлами JSON и несколькими случаями это работает достаточно хорошо.

0 голосов
/ 24 октября 2019

Я бы подошел к этому как к двухпроходному методу:

Первый проход: создайте узлы для оценки и предмета. Вы могли бы использовать apoc.do.case / when , если это полезно

Второй проход: только сканировать взаимосвязь, а затем выполнить МАТЧ, чтобы найти узлы evaluation и subject на основеsource_ref и target_ref, а затем MERGE или CREATE отношения для их соединения.

Подобно этому, на вас не влияют такие ситуации, как отношения, возникающие перед узлами, которые он соединяет и т. Д., Или количество элементоввы попали в objects

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...