在 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(如果重要的话)
我认为使用 gremlin 实现此目的的最佳方法是为您的子网存储整数值:fromIp
和 toIp
然后您可以 运行 使用整数运算符进行简单查询,例如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),
))
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())
我正在寻找一种在 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(如果重要的话)
我认为使用 gremlin 实现此目的的最佳方法是为您的子网存储整数值:fromIp
和 toIp
然后您可以 运行 使用整数运算符进行简单查询,例如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),
))
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())