我有以下令人难以置信的简单数据集,它包含带有时间戳的IP-> FQDN绑定事件。
我已将此数据添加到neo4j图表中。
我一直在努力写一个返回“在时间戳7时绑定到fqdn1的ips”的查询
我希望结果只是ip2,因为它在时间1绑定到fqdn1然后在时间戳7之前从未绑定到任何其他内容。我不希望ip1在结果集中,因为它在时间绑定到fqdn2 2因此它在时间7没有与fqdn1绑定。
我无处可去,我期待它,因为我还没有对Cypher的思维方式进行精神上的飞跃。
有人可以帮帮我吗?
编辑:时间戳存储为BOUND_TO关系的属性。
答案 0 :(得分:1)
不得不猜测你的时间戳存储在哪里,但我想你可能想要的是:
MATCH (f:FQDN{name:"fqdn1"})<-[:BOUND_TO{timestamp:2}]-(ip:IP)
RETURN ip
编辑 - 如果您需要范围
MATCH (f:FQDN{name:"fqdn1"})<-[bound:BOUND_TO]-(ip:IP)
WHERE bound.timestamp >= 1 AND bound.timestamp < 5
RETURN ip
ORDER BY bound.timestamp ASC
修改 - 问题更新后
我不认为这是一个好主意,我会考虑如何调整模型以便以更加图形的方式存储时间序列数据,但这样的事情(相对未经测试):< / p>
MATCH(f:FQDN {name:&#34; fqdn1&#34;})&lt; - [b:BOUND_TO] - (ip:IP)
在哪里b.timestamp&lt; = 2
用f,b,ip
MATCH(其他:FQDN)&lt; - [ob:BOUND_TO] - (ip)
其他&lt;&gt; f AND ob.timestamp&lt; b.timestamp AND ob.timestamp&lt; = 2
返回f,b,ip
以上不太合适,需要将结果用作过滤器:
MATCH (f:FQDN { name:"fqdn1" })<-[b:BOUND_TO]-(ip:IP)
WHERE b.timestamp <= 3
OPTIONAL MATCH (other:FQDN)<-[ob:BOUND_TO]-(ip)
WHERE other <> f AND ob.timestamp > b.timestamp AND ob.timestamp <= 3
WITH ip, b, COLLECT(ob) AS bindings
WHERE LENGTH(bindings)= 0
RETURN ip
除了 - 取决于用例
您可能希望仅将活动绑定IP存储为与FQDN的直接关系,然后在该单一绑定IP后面添加(手动管理的)历史绑定列表。这是因为遍历列表然后按时间戳/按时间戳顺序查询会更快。