Запрос IP-адресов (IPv4 / IPv6) в графической базе данных Amazon Neptune - PullRequest
1 голос
/ 21 апреля 2020

Я ищу способ хранения диапазонов IP-адресов в Нептуне, который позволит мне позже выполнять запросы на основе диапазонов IP-адресов.
Несколько примеров:
1. Найти все вершины со свойством "address_range" где адрес находится в su bnet X
2. Найти все вершины со свойством "address_range", где адрес находится не в su bnet Y
3. Найти все вершины со свойством "address_range" где адрес перекрывается с su bnet Z

, где X, Y, Z являются подсетями, такими как 62.93.132.186/28.
То же самое касается диапазонов IPv6.

  • Я использую Gremlin (если это имеет значение)

1 Ответ

4 голосов
/ 21 апреля 2020

Я думаю, что лучший способ достичь этого с помощью gremlin - это хранить целые значения для ваших подсетей: fromIp и toIp, тогда вы можете выполнить простой запрос с целочисленными операторами, такими как gte & lte, чтобы ответить на каждый case:

содержится в su bnet X:

g.V().hasLabel('Subnet').has('fromIp', gte(X.fromIp)).has('toIp', lte(X.toIp))

Не содержится в su bnet Y:

g.V().hasLabel('Subnet').not(
  has('fromIp', gte(Y.fromIP)).
  has('toIp', lte(Y.toIp)))

Перекрывается с su bnet Z:

g.V().hasLabel('Subnet').where(coalesce(
     has('fromIp', lte(Z.fromIp)).has('toIp', gte(Z.fromIp)),
     has('fromIp', lte(Z.toIp)).has('toIp', gte(Z.toIp),
))

пример: https://gremlify.com/7g

подсетей в дБ: 10,0 .0.0 / 28, 10.0.0.0/8, 11.0.0.0/8

test su bnet: 10.0.0.0/24(167772161, 167772414):

g.inject(1).
  project('contain', 'not-contain', 'overlap').
    by(V().hasLabel('Subnet').
      has('fromIp', gte(167772161)).
      has('toIp', lte(167772414)).values('subnet').fold()).
    by(V().hasLabel('Subnet').
      not(has('fromIp', gte(167772161)).
        has('toIp', lte(167772414))).values('subnet').fold()).
    by(V().hasLabel('Subnet').coalesce(
        has('fromIp', lte(167772161)).
        has('toIp', gte(167772161)),
        has('fromIp', lte(167772414)).
        has('toIp', gte(167772414))
      ).values('subnet').fold())
...