Я думаю, что лучший способ достичь этого с помощью 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())