【问题标题】:Cypher query that stops after a specific condition在特定条件后停止的密码查询
【发布时间】:2017-03-16 12:51:39
【问题描述】:

我是 Neo4j 和 Cypher 的新手。我有一大张由友谊相关的人的图表,我想得到所有的路径,从 1 人开始,但在另一个州的朋友处停止。我需要显示来自另一个州的第一个朋友,但没有他/她的朋友。基本上,我希望路径在找到相关朋友不是来自指定状态的节点时结束。 任何帮助将不胜感激。

Jack {st:'MI'}<-[Friend]-Jill {st:'MI'}<-[Friend]-John {st:'OH'}<-[Friend]-Tim {st:'OH'}

查询应该只返回 Jack、Jill 和 John。不是蒂姆。

编辑/添加

John <-[Friend]-Joan {st:'MI'}

Joan 也不应该在查询中返回。

谢谢!

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这样的事情怎么样。匹配所有处于相同状态的朋友,然后走这条路的尽头,并匹配所有来自不同州的朋友。

    MATCH path=(start:Person {name: 'Jack'})<-[:FRIEND*]-(end:Person)
    WHERE end.st = start.st
    AND all(p in nodes(path) where p.st = start.st)
    WITH path, end
    RETURN nodes(path), [(end)<-[:FRIEND]-(other:Person) WHERE other.st <> end.st | other]  as other_state
    

    此查询将仅返回存在other_state 节点的行。

    MATCH path=(start:Person {name: 'Joe'})<-[:FRIEND*..10]-(end:Person)
    WHERE end.st = start.st
    AND all(p in nodes(path) where p.st = start.st)
    WITH nodes(path) as same_state, [(end)<-[:FRIEND]-(other:Person) WHERE other.st <> end.st | other]  as other_state
    WHERE size(other_state) > 0
    RETURN same_state, other_state
    

    更改后将适应 John、Joan 和 Tim 用例

    MATCH path=(start:Person {name: 'John'})-[:FRIEND*0..]-(end:Person)
    WHERE end.st = start.st
    AND all(p in nodes(path) where p.st = start.st)
    WITH nodes(path) as same_state, [(end)-[:FRIEND]-(other:Person) WHERE other.st <> end.st | other]  as other_state
    WHERE size(other_state) > 0
    RETURN same_state, other_state
    

    【讨论】:

    • 这行得通,但有一个转折点。如果琼是密歇根州约翰的朋友——她也不应该出现。我将更新数据集以使其更加清晰。对不起,我错过了。
    • 第二个查询适用于 Jack,但如果我从 John 开始,我想找回 Joan 和 Tim。它不会为 John 返回任何东西。这可能比我想象的要难。
    • 添加了一个新查询。不得不改变一些事情。为仅包含单个节点的路径增加了容量,并消除了关系中的方向性。
    • 这适用于 John,但如果您从 Jack 开始,它仍会返回 Joan。我非常感谢您对此的意见。谢谢。
    • 抱歉,错过了,我添加了更新以适应它
    猜你喜欢
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2022-10-19
    • 2014-02-14
    • 2014-05-08
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多