【问题标题】:Matching all nodes related to a set of other nodes - neo4j匹配与一组其他节点相关的所有节点 - neo4j
【发布时间】:2019-11-27 21:20:23
【问题描述】:

我刚刚开始使用 neo4j,希望得到一些帮助来解决问题。

我有一组Questions 需要信息 (Slots) 才能回答。

图表的规则(即每个QuestionSlotsrequired)如下所示:

Graph diagram here

在我有一组插槽的情况下,例如[Slot A, Slot B] 我希望能够检查所有与 Slots 相关的 Questions,例如[Question 1Question 2]。

然后我希望能够检查Questions 中的哪一个required Slots 可用,例如[Question 1]

这可能吗?如果可以,我应该怎么做?

【问题讨论】:

    标签: neo4j py2neo


    【解决方案1】:

    是的,这是可能的。

    一些数据夹具:

    CREATE (q1:Question {name: "Q1"})
    CREATE (q2:Question {name: "Q2"})
    CREATE (s1:Slot {name: "Slot A"})
    CREATE (s2:Slot {name: "Slot B"})
    CREATE (s3:Slot {name: "Slot C"})
    CREATE (q1)-[:REQUIRES]->(s1)
    CREATE (q1)-[:REQUIRES]->(s2)
    CREATE (q2)-[:REQUIRES]->(s1)
    CREATE (q2)-[:REQUIRES]->(s3)
    

    查找与插槽列表相关的问题:

    MATCH p=(q:Question)-[:REQUIRES]->(slot)
    WHERE slot.name IN ["Slot A", "Slot B"]
    RETURN p
    

    然后,查找与槽列表相关的问题,如果槽列表包含问题的所有必需槽,则返回布尔值:

    MATCH p=(q:Question)-[:REQUIRES]->(slot)
    WHERE slot.name IN ["Slot A", "Slot B"]
    WITH q, collect(slot) AS slots
    RETURN q, ALL(x IN [(q)-[:REQUIRES]->(s) | s] WHERE x IN slots)
    
    ╒═════════════╤═══════════════════════════════════════════════════════╕
    │"q"          │"ALL(x IN [(q)-[:REQUIRES]->(s) | s] WHERE x IN slots)"│
    ╞═════════════╪═══════════════════════════════════════════════════════╡
    │{"name":"Q1"}│true                                                   │
    ├─────────────┼───────────────────────────────────────────────────────┤
    │{"name":"Q2"}│false                                                  │
    └─────────────┴───────────────────────────────────────────────────────┘
    

    关于那部分的一点解释ALL(x IN [(q)-[:REQUIRES]->(s) | s] WHERE x IN slots)

    ALL 谓词将检查列表中每个值的条件是否为真,例如 ALL (x IN [10,20,30] WHERE x > 5)

    extract 快捷语法,你传递一个列表,它返回一个提取值的列表,语法是extract(x IN <LIST> | <key to extract>) 例如:

    extract(x IN [{name: "Chris", age: 38},{name: "John", age: 27}] | x.age)
    
    // equivalent to the shortcut syntax for extract, with square brackets
    
    [x IN [{name: "Chris", age: 38},{name: "John", age: 27}] | x.age]
    

    将返回[38,27]

    现在组合起来:

    对于每条路径,提取 Slot 节点

    [(q)-[:REQUIRES]->(s) | s]
    
    Returns 
    
    [s1, s2]
    

    s1 和 s2 中的每一个是否都在之前收集的 slot 节点列表中?

    ALL(x IN [(q)-[:REQUIRES]->(s) | s] WHERE x IN slots)
    
    Return true or false
    

    只有在为真时才返回问题:

    MATCH p=(q:Question)-[:REQUIRES]->(slot)
    WHERE slot.name IN ["Slot A", "Slot B"]
    WITH q, collect(slot) AS slots
    WITH q WHERE ALL(x IN [(q)-[:REQUIRES]->(s) | s] WHERE x IN slots)
    RETURN q
    

    【讨论】:

    • 很好的解释。很有帮助。一个跟进 - 有没有办法只返回以TRUE返回的Questions
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多