匹配与一组其他节点相关的所有节点 - neo4j
Matching all nodes related to a set of other nodes - neo4j
我刚刚开始使用 neo4j,希望得到一些帮助来解决问题。
我有一组 Questions
需要信息 (Slots
) 才能回答。
图表的规则(即每个 Question
的 Slots
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
我刚刚开始使用 neo4j,希望得到一些帮助来解决问题。
我有一组 Questions
需要信息 (Slots
) 才能回答。
图表的规则(即每个 Question
的 Slots
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