1

我创建了一个图形结构。其中有一些关系如下

Fever --causes--> Malaria  ,  Fever --causes--> dehydration
Flu   --causes--> Malaria  ,  Flu   --causes--> SwineFlu

现在我想编写一个密码查询,它返回 Fever 和 Flu 原因的交集,这意味着这里的输出应该是 Malaria。

我正在编写以下查询,但它没有给我任何节点。

START aa=node(*) MATCH (aa)-[:causes]->(symptoms) 
WHERE (aa.Name = "Fever") AND (aa.Name = "Flu") RETURN distinct symptoms;

任何帮助,将不胜感激!

4

2 回答 2

3

尝试在您的子句中使用OR而不是。ANDWHERE

编辑:

我认为有两个部分两个它。

首先,对于您的“原因的交叉点”,您应该说明表达该交叉点的模式。可以将其视为准确说明您想要返回的数据,然后根据图表中的内容打开或概括您想要填充的模式的那些部分。如果我了解您的模型和您的意图,这将形成类似的模式

(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
于 2013-10-12T13:01:45.693 回答
2

你可以这样做:

START aa=node(*) 
MATCH aa-[:causes]->symptom 
WITH collect(aa.name) AS aa, symptom 
WHERE ALL (x IN ['Fever' , 'Flu'] 
           WHERE x IN aa) 
RETURN symptom

http://console.neo4j.org/r/7awspi

但理想情况下,您会进行索引查找,类似于此。

START aa=node:node_auto_index('name:("Fever", "Flu")') 
MATCH aa-[:causes]->symptom 
RETURN symptom, count(*) 
ORDER BY count(*) DESC

http://console.neo4j.org/r/bawo5d

于 2013-10-12T16:14:54.760 回答