尝试在您的子句中使用OR
而不是。AND
WHERE
编辑:
我认为有两个部分两个它。
首先,对于您的“原因的交叉点”,您应该说明表达该交叉点的模式。可以将其视为准确说明您想要返回的数据,然后根据图表中的内容打开或概括您想要填充的模式的那些部分。如果我了解您的模型和您的意图,这将形成类似的模式
(fever)-[:CAUSES]->(malaria)<-:[CAUSES]-(flu)
节点的标识符只是占位符,但让它们表示您已经知道流感和发烧都与疟疾有这种类型的关系。然后如果你想问,“有哪些东西与流感和发烧都有这种关系?” 你可以把它概括为
(fever)-[:CAUSES]->(unknown)<-[:CAUSES]-(flu)
这些模式本身对于 cypher 是相同的,但是由于您将提供两个已知节点,即流感节点和发烧节点,并且您知道您想要它们根据某种关系具有共同点,那么您可以准确地声明该模式,并且只省略常见的未知节点。
其次,你需要用你已经知道的节点来填充这个模式。如果您要按原样匹配模式,其中唯一已知的部分是关系的类型和方向,您会发现所有以这种方式相关的节点的三元组。因此,如果您希望此模式仅匹配流感和发烧,您需要提供或填写这些节点到模式中。通常,您将使用索引查找来执行此操作(无论如何,直到 2.0 发布),例如
START flu=node:Symptom(name="Flu"), fever=node:Symptom(name="Fever")
然后在一个MATCH
子句中继续你的模式。这样,除了您正在寻找的一个未知节点之外,模式就被完全填充了。(请注意,您可以用一袋节点和单个节点填充模式中的占位符,但该部分模式仍然属于模式中提供的内容。)如果您没有索引,您可以填写使用“所有节点”表示流感和发烧的占位符,然后提供进一步的过滤标准。这很糟糕,但它有效。
START flu=node(*), fever=node(*)
MATCH (flu)-[:CAUSES]->(unknown)<-[:CAUSES]-(fever)
WHERE flu.Name="Flu" AND fever.Name="Fever"
RETURN DISTINCT unknown