【发布时间】:2016-04-18 16:45:52
【问题描述】:
考虑以下通过 2 种边相互连接的节点:直接和相交。查询需要发现满足以下所有规则的 2 个节点之间的所有可能路径:
- 0..N 直接边
- 0..1 相交边
- 相交边可以在直接边之间
这些路径在 nodeA 和 nodeZ 之间被认为是有效的:
(nodeA)-[:direct]->(nodeB)-[:direct]->(nodeC)->[:direct]->(nodeZ)(nodeA)-[:intersect]->(nodeB)-[:direct]->(nodeC)->[:direct]->(nodeZ)(nodeA)-[:direct]->(nodeB)-[:intersect]->(nodeC)->[:direct]->(nodeZ)(nodeA)-[:direct]->(nodeB)->[:direct]->(nodeC)-[:intersect]->(nodeZ)
基本上相交边可以在路径中的任何地方发生,但只能发生一次。 在不存在的 neo4j 版本中,我理想的密码查询是这样的:
MATCH (from)-[:direct*0..N|:intersect*0..1]->(to)
但是 neo4j 不支持边类型的多重约束:(.
更新 23.04.16
有 6609 个节点(总共 550k 个)、5184 个直接类型的边(总共 440k 个)和 34119 个相交类型(总共 37289 个)。预计会有一些循环引用(neo4j 避免了,不是吗?)
看起来很有希望但未能在几秒钟内完成的查询:
MATCH p = (from {from: 1})-[:direct|intersect*0..]->(to {to: 99})
WHERE
123 < from.departureTS < 123 + 86400 //next day
AND REDUCE(s = 0, x IN RELATIONSHIPS(p) | CASE TYPE(x) WHEN 'intersect' THEN s + 1 ELSE s END) <= 1
return p;
【问题讨论】: