2013-10-12 77 views
1

我已創建了一個圖形結構.Of他們也有一定的關係如下的Neo4j:多個謂詞過濾

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

現在我想寫它返回的發熱和流感導致路口暗號查詢,意味着此處產出應該是瘧疾。

我正在寫下面的查詢,但它沒有給我任何節點。

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

任何幫助將不勝感激!

+0

新版本?你有任何索引可以查找嗎? –

+0

不,會不會有索引,因爲當我通過發燒尋找原因時,它會給我適當的結果。 – pawan9977

+0

你應該在Name上有一個索引,所以它不需要掃描圖表來找到它們。你使用neo 1.9還是2.0?你沒有得到任何結果的原因是因爲在相同的中間結果中,對於aa.Name永遠不會有兩個不同的值,所以你必須使用OR並對它們進行計數,或者如果你只想找到這些結果,他們需要分開匹配。 –

回答

3

請在WHERE條款中使用OR而不是AND

編輯:

我覺得有兩個地方的兩個吧。

首先,對於你的「原因交集」,你應該陳述一個表達該交集的模式。可以把它想象成你想要的數據,然後根據圖中的內容打開或概括你想要填充的模式的那些部分。如果我理解你的模型和你的意圖,這將使得像

(fever)-[:CAUSES]->(malaria)<-:[CAUSES]-(flu) 

模式爲節點的標識只是佔位符,但讓他們代表你已經知道,感冒和發熱都有這種類型的關係瘧疾。那麼,如果你想問,「與流感和發燒有這種關係的所有事情是什麼?」你可以概括它作爲

(fever)-[:CAUSES]->(unknown)<-[:CAUSES]-(flu) 

在自己這些模式都是暗號是相同的,但因爲你將提供兩種已知節點,流感節點,發燒節點,你知道你要他們在根據共同擁有的東西到一定的關係,那麼你可以精確地聲明該模式,並且只留下常見的未知節點。

其次,你需要填充這個模式和你已經知道的節點。如果要按照原樣匹配模式,其中唯一已知的部分就是關係的類型和方向,那麼您會發現所有三元組的節點都以這種方式相關。所以如果你想讓這種模式只與流感和發燒相匹配,你需要在這些模式中提供或填充這些節點。通常情況下,你會做這個索引查找(直到2.0反正realeased),像

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 
+0

然後它只給我發熱的原因。 – pawan9977

+0

任何建議,請... – pawan9977

+0

對不起,我的回答很短,我試着回答得更充分。如果仍有問題,請考慮在[console.neo4j.org]上設置示例圖表供人們查看。 – jjaderberg

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

+0

也,我認爲你的關係是倒退。當然,發燒不會導致瘧疾。 :)(這不是真的那麼重要,除了那些看着這個模型的人。) –

+0

太棒了..謝謝你這麼多..它的工作.. – pawan9977

+1

已經添加了一個graphgist對此,http://gist.neo4j。 org /?7010105作爲參考。隨意闡述。 –