Neo4j Cypher查询简单的IP-> FQDN绑定数据集

时间:2014-10-06 16:25:00

标签: neo4j cypher

我有以下令人难以置信的简单数据集,它包含带有时间戳的IP-> FQDN绑定事件。

enter image description here

我已将此数据添加到neo4j图表中。

enter image description here

我一直在努力写一个返回“在时间戳7时绑定到fqdn1的ips”的查询

我希望结果只是ip2,因为它在时间1绑定到fqdn1然后在时间戳7之前从未绑定到任何其他内容。我不希望ip1在结果集中,因为它在时间绑定到fqdn2 2因此它在时间7没有与fqdn1绑定。

我无处可去,我期待它,因为我还没有对Cypher的思维方式进行精神上的飞跃。

有人可以帮帮我吗?

编辑:时间戳存储为BOUND_TO关系的属性。

1 个答案:

答案 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后面添加(手动管理的)历史绑定列表。这是因为遍历列表然后按时间戳/按时间戳顺序查询会更快。