在 Amazon Neptune 图形数据库中查询 IP 地址 (IPv4/IPv6)

Querying IP addresses (IPv4/IPv6) in Amazon Neptune graph database

我正在寻找一种在 Neptune 中存储 IP 地址范围的方法,这将使我稍后能够 运行 基于 IP 范围的查询。
几个例子:
1. 找到所有属性 "address_range" 的顶点,其中地址在子网X
2. 找到所有属性 "address_range" 的顶点地址不在子网Y
3. 找到地址与子网Z重叠的所有属性 "address_range"的顶点

其中 X、Y、Z 是子网,例如 62.93.132.186/28。
IPv6 范围也是如此。

我认为使用 gremlin 实现此目的的最佳方法是为您的子网存储整数值:fromIptoIp 然后您可以 运行 使用整数运算符进行简单查询,例如gte & lte 回答每个案例:

包含在子网 X:

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

不包含在子网 Y:

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

与子网 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

db 中的子网:10.0.0.0/28、10.0.0.0/8、11.0.0.0/8

测试子网: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())