【发布时间】:2017-06-29 12:10:30
【问题描述】:
我有这个简单的图表:
create (a:ent {id:'a'})-[:rel]->(:ent {id:'b'})-[:rel]->(c:ent {id:'c'})-[:rel]->(d:ent {id:'d'})-[:rel]->(:ent {id:'e'})-[:rel]->(a),
(d)-[:rel]->(c),
(c)-[:rel]->(f:ent {id:'f'})-[:rel]->(g:ent {id:'g'})-[:rel]->(a),
(g)-[:rel]->(f)
鉴于是'a',即节点(:ent {id:'a'}),我想编写返回“恰好两个唯一最长的”路径的查询:
a->b->c->d->e
a->b->c->f->g
正如您在此处看到的,我应该在这里考虑图表中的周期。看来查询建议here应该没问题,我改写如下:
MATCH path=(:ent{id:'a'})-[:rel*]->(:ent)
WHERE ALL(n in nodes(path)
WHERE 1=size(filter(m in nodes(path)WHERE m.id=n.id))
)
RETURN path
我知道查询没有给出我想要得到的确切结果,但是如果我正确理解逻辑,它至少可以避免循环路径。我觉得这个查询可以是一个很好的起点。但这给了我奇怪的错误:
key not found: UNNAMED26
这里有什么问题?我无法通过这个不清楚的错误描述来查明密码中的错误。
更新
我尝试了一个新的更简单的查询:
MATCH path=(s:ent{id:'a'})-[:rel*]->(d:ent)
WHERE not (d)-[:rel]->() OR (d)-[:rel]->(s)
RETURN extract(x IN nodes(path)| x.id) as result
返回:
╒═════════════════════╕
│result │
╞═════════════════════╡
│[a, b, c, d, e] │
├─────────────────────┤
│[a, b, c, d, c, f, g]│
├─────────────────────┤
│[a, b, c, f, g] │
└─────────────────────┘
如您所见,由于循环(d)<->(c) 循环,它有一个冗余路径[a, b, c, d, c, f, g]。老实说,我觉得这篇文章中的原始/第一个查询应该消除它。谁能告诉我如何使它工作...?
【问题讨论】: