匹配与一组其他节点相关的所有节点 - neo4j

Matching all nodes related to a set of other nodes - neo4j

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

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

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

Graph diagram here

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

然后我希望能够检查 Questions 中的哪些所有 required Slots 可用,例如[Question 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

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

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 快捷语法,你传递一个列表,它 return 是提取值的列表,语法是 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]

会 return [38,27]

现在合并它:

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

[(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

Return只有当真时的问题:

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