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

ceh*_*rep 1 neo4j py2neo

我刚刚开始使用neo4j,希望对尝试解决问题有所帮助。

我有一组Questions要求提供信息(Slots)的答案。

该图的规则(即Slots required每个的Question)如下所示:

图表图在这里

在一个场景中,我有一组插槽例如,[ Slot ASlot B]我希望能够检查所有QuestionsSlots相关的如[ Question 1Question 2]。

然后,我希望能够检查Questions所有required Slots可用的,例如[ Question 1]

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

Chr*_*sen 5

是的,有可能。

一些数据装置:

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)