我刚刚开始使用neo4j,希望对尝试解决问题有所帮助。
我有一组Questions要求提供信息(Slots)的答案。
该图的规则(即Slots required每个的Question)如下所示:
在一个场景中,我有一组插槽例如,[ Slot A,Slot B]我希望能够检查所有Questions的Slots相关的如[ 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)
Run Code Online (Sandbox Code Playgroud)
查找与广告位列表有关的问题:
MATCH p=(q:Question)-[:REQUIRES]->(slot)
WHERE slot.name IN ["Slot A", "Slot B"]
RETURN p
Run Code Online (Sandbox Code Playgroud)
然后,查找与广告位列表相关的问题,如果广告位列表包含问题的所有必需广告位,则返回布尔值:
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 ?
???????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
对此部分的解释 ALL(x IN [(q)-[:REQUIRES]->(s) | s] WHERE x IN slots)
在ALL谓词,将检查在列表中的每个值的条件是真实的,例如ALL (x IN [10,20,30] WHERE x > 5)
the extract shortcut syntax, you pass a list, it returns a list of the extracted values, the syntax is extract(x IN <LIST> | <key to extract>) for example :
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]
Run Code Online (Sandbox Code Playgroud)
Will return [38,27]
Combining it now :
For every path, extract the Slot node
[(q)-[:REQUIRES]->(s) | s]
Returns
[s1, s2]
Run Code Online (Sandbox Code Playgroud)
Are every of s1 and s2, in the list of the slot nodes previously collected ?
ALL(x IN [(q)-[:REQUIRES]->(s) | s] WHERE x IN slots)
Return true or false
Run Code Online (Sandbox Code Playgroud)
Return only the questions when true :
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |