【问题标题】:Querying IP addresses (IPv4/IPv6) in Amazon Neptune graph database在 Amazon Neptune 图形数据库中查询 IP 地址 (IPv4/IPv6)
【发布时间】:2020-04-21 12:15:17
【问题描述】:

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

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

  • 我正在使用 Gremlin(如果重要的话)

【问题讨论】:

  • 这个问题非常具体到 gremlin 语言和数据模型。你能添加gremlin标签吗?
  • 您是要进行精确匹配,例如 property == "62.93.132.186/28",还是要根据查找哪个 CIDR 块对单个 IP 地址进行更精细的操作它属于?
  • 我需要更多的东西来检查范围。例如,我希望范围为 10.0.0.0/28 的顶点出现在 10.0.0.0/24 @Kelvin Lawrence 中所有顶点的查询结果中

标签: ip-address gremlin tinkerpop amazon-neptune


【解决方案1】:

我认为使用 gremlin 实现此目的的最佳方法是为您的子网存储整数值:fromIptoIp 然后您可以使用整数运算符(如 gtelte)运行一个简单的查询来回答每个问题案例:

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

数据库中的子网: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())

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 2011-06-09
    • 2013-07-02
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多