You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Neo4j的Cypher查询WHERE子句中排除私有IP段?

生成唯一公网IP列表的Cypher解决方案

先明确要排除的IP范围

需要过滤的私有IP和回环IP段包括:

  • 10.0.0.0 至 10.255.255.255
  • 172.16.0.0 至 172.31.255.255
  • 192.168.0.0 至 192.168.255.255
  • 127.0.0.0 至 127.255.255.255(回环地址)

方案一:纯Cypher实现(无需额外扩展)

不用依赖第三方工具,直接通过字符串匹配和条件判断完成过滤,适合刚入门的场景:

MATCH (A:Account)-[R1:RESOURCE]->(B:DNSRecord)
WHERE 
  // 排除10开头的私有IP
  NOT B.value STARTS WITH '10.'
  // 排除172.16-31区间的私有IP
  AND NOT (B.value STARTS WITH '172.' AND TOINTEGER(SUBSTRING(B.value, 4, 2)) BETWEEN 16 AND 31)
  // 排除192.168开头的私有IP
  AND NOT B.value STARTS WITH '192.168.'
  // 排除回环地址
  AND NOT B.value STARTS WITH '127.'
  // 可选:过滤非IP格式的无效值
  AND B.value =~ '^\\d+\\.\\d+\\.\\d+\\.\\d+$'
// 用DISTINCT生成唯一IP列表,返回IP而非整个节点更实用
RETURN DISTINCT B.value AS public_ip
ORDER BY public_ip

方案二:用APOC扩展简化代码(更高效)

如果你的Neo4j已经安装了APOC扩展,可以用内置IP判断函数,代码更简洁:

MATCH (A:Account)-[R1:RESOURCE]->(B:DNSRecord)
WHERE 
  // APOC函数自动识别私有/回环IP
  apoc.net.isPrivate(B.value) = FALSE
  // 可选:过滤非IP格式值
  AND B.value =~ '^\\d+\\.\\d+\\.\\d+\\.\\d+$'
RETURN DISTINCT B.value AS public_ip
ORDER BY public_ip

额外优化建议

  • 如果DNSRecord的value属性查询频繁,建议创建索引提升性能:
    CREATE INDEX idx_dnsrecord_value FOR (d:DNSRecord) ON (d.value)
    
  • 若节点中存在域名等非IP值,正则判断能有效避免无效数据混入结果

内容的提问来源于stack exchange,提问作者abhinav singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:01:14