Как реализовать это в python: Проверьте, существует ли вершина, если нет, создайте новую вершину - PullRequest
0 голосов
/ 02 октября 2019

Я хочу создать базу данных Нептуна и выгружать в нее данные. Я загружаю исторические данные из DynamoDB в S3, эти файлы в формате CSV. Заголовок в этих csv выглядит так:

~id, someproperties:String, ~label

Затем мне нужно реализовать потоковую передачу в реальном времени на эту Нептунскую дб через лямбду, в функции лямбда я проверю, существует ли одна вершина (или ребра) илинет, если существует, я обновлю вершину (или ребра), в противном случае я создаю новую. В python моя реализация такова:

g.V().hasLabel('Event').has(T.id, event['Id']).fold().coalesce(unfold(), addV('Event').property(T.id, event['Id'])).property(Cardinality.single, 'State', event['State']).property('sourceData', event['sourceData']).next()

Здесь у меня есть несколько вопросов:

  1. В потоковом режиме в реальном времени мне нужно запросить, есть ли уже вершина с идентификатором,поэтому мне нужно запросить узлы исторических данных, так может ли has(T.id, event['Id']) сделать это? или я должен просто использовать has(id, event['Id']) или has("id", event['Id'])?
  2. Я использовал g.V().has('Event', T.id, event['Id']) вместо g.V().hasLabel('Event').has(T.id, event['Id']), но получил ошибку типа cannot local NeptuneGraphTraversal.has(). Эти два запроса одно и то же?

1 Ответ

1 голос
/ 03 октября 2019

Вот три бита Gremlin, о которых у вас возник вопрос:

g.V().has(T.id, "some-id")
g.V().has(id, "some-id")
g.V().has("id", "some-id")

Первые два вернут вам тот же результат, что и id является членом T (как точка стиляПользователи Gremlin обычно статически импортируют id, чтобы на него можно было кратко ссылаться. Последний обход отличается от первых двух, поскольку в качестве значения String он ссылается на стандартный ключ свойства с именем «id». Вообще говоря, TinkerPop рекомендует не использовать имя ключа свойства, например «id» или «label», так как это может привести к ошибкам и путанице со значениями T.

Что касается второй части вашеговопрос вращается вокруг:

g.V().has('Event', T.id, event['Id']) 
g.V().hasLabel('Event').has(T.id, event['Id'])

Вы не можете передать T.id в 3-ю форму has(), как указывает Кельвин, поскольку подпись шага допускает только String в этой второй позиции. Также не имеет смысла разрешать T там, потому что T.label уже учитывается первым аргументом, а T.id относится к фактическому идентификатору элемента графа. Если вы знаете это значение, то вам не нужно было бы указывать T.label в первую очередь, поскольку T.id уже однозначно идентифицирует элемент. Вы бы просто сделали g.V(event['Id']).

...