Хранение списка в вершине с помощью Gremlin и Azure Cosmos Graph

Я пытаюсь сохранить список изменений, внесенных в вершину, в самой вершине. В идеале я хотел бы что-то вроде этого:

{
    "id": "95fcfa87-1c03-436d-b3ca-340cea926ee9",
    "label": "person",
    "type": "vertex",
    "log": [{
            "user": "[email protected]",
            "action": "update",
            "timestamp": "22-03-2017",
            "field": "firstName",
            "oldValue": "Marco"
        }
    ]
}

Используя эту цепочку методов, я могу достичь следующей структуры

graph.addV('person')
     .property('firstName', 'Thomas')
     .property(list, 'log', '22-03-2017')
     .properties('log')
     .hasValue('22-03-2017', '21-03-2017')
     .property('user','[email protected]')
     .property('action', 'update')
     .property('field', 'firstName')
     .property('oldValue', 'Marco')
{
    "id": "95fcfa87-1c03-436d-b3ca-340cea926ee9",
    "label": "person",
    "type": "vertex",
    "properties": {
        "firstName": [{
                "id": "f23482a9-48bc-44e0-b783-3b74a2439a11",
                "value": "Thomas"
            }
        ],
        "log": [{
                "id": "5cfa35e1-e453-42e2-99b1-eb64cd853f22",
                "value": "22-03-2017",
                "properties": {
                    "user": "[email protected]",
                    "action": "update",
                    "field": "firstName",
                    "oldValue": "Marco"
                }
            }
        ]
    }
}

Однако это кажется слишком сложным, так как мне придется хранить значение и добавлять к нему свойства.
Можно ли добавить анонимные объекты (т.е. без id и value) с вышеупомянутыми данными?


person andreasnauta    schedule 22.03.2018    source источник
comment
Использование свойств вершины Gremlin со списком и мета-свойствами — единственный способ иметь более сложные объекты, которые также можно запрашивать в вершине. Следует иметь в виду, что размер Vertex ограничен 2 МБ (фактический размер Vertex, хранящийся в CosmosDB, будет отличаться от размера ответа Vertex), поэтому, если ожидается, что данные журнала будут расти без регулярной очистки, вы можете захотеть рассмотрите другую модель данных (возможно, фрагменты данных журнала хранятся в отдельных вершинах)   -  person Oliver Towers    schedule 24.03.2018
comment
@OliverTowers Спасибо и хорошее замечание. Иметь то, что является практически неограниченным списком в структуре с ограниченным размером, звучит как плохая идея. Если вы создадите ответ с этим, я могу принять его.   -  person andreasnauta    schedule 26.03.2018


Ответы (1)


Не фактическое решение для хранения правильных объектов в журнале истории, но если вы просто используете его как журнал и вам не нужно обращаться к нему или запрашивать его по его свойствам, вы можете просто поместить сериализованный JSON в значение?

Что-то вроде этих строк должно приблизительно соответствовать структуре, которую вы запрашиваете:

dynamic entry = new JObject();
entry.user = "[email protected]";
entry.action = "update";
entry.timestamp = "22-03-2017 12:34:56";
entry.field = "firstName";
entry.oldValue = "Marco";

graph.addV('person')
     .property('firstName', 'Thomas')
     .property(list, 'log', entry.ToString());
{
    "id": "95fcfa87-1c03-436d-b3ca-340cea926ee9",
    "label": "person",
    "type": "vertex",
    "properties": {
        "firstName": [{
                "id": "f23482a9-48bc-44e0-b783-3b74a2439a11",
                "value": "Thomas"
            }
        ],
        "log": [{
                "id": "5cfa35e1-e453-42e2-99b1-eb64cd853f22",
                "value": "{\"user\":\"[email protected]\",\"action\":\"update\",\"timestamp\":\"22-03-2017\",\"field\":\"firstName\",\"oldValue\":\"Marco\"}"
            }
        ]
    }
}

Эти записи в журнале можно легко прочитать, десериализовать, использовать и представить, но они мало что сделают для возможности запросов.

person Flygenring    schedule 23.03.2018
comment
Интересная идея, однако нам нужно иметь возможность запросить это. - person andreasnauta; 23.03.2018