2014-02-07 53 views
1

愛麗絲愛小貓和小狗,只會去他們都在場的地方。她喜歡guppies和金魚,並堅持至少有一個在場。她雖然討厭針鼴鼠,但不會出現在任何有刺的東西的地方。鮑勃喜歡小貓和倉鼠,但對其他動物,魚,刺或其他方面沒有強烈的感受。Neo4J密碼可選屬性或關係與集合的高效比較

CREATE (alice:PERSON {name: 'Alice', loves: ['kittens','puppies'], likes: ['guppies','goldfish'], hates:['echidnas']}) 
CREATE (bob:PERSON {name: 'Bob', likes: ['kittens','hamsters']}) 

我正在舉辦派對,我會有小貓,小狗,guppies和海牛。誰來?以下是我的問題。

MATCH (a:PERSON) 
WHERE 
(NOT HAS (a.loves) OR (LENGTH(FILTER(love IN a.loves WHERE love IN ['kittens','puppies','guppies','manatees'])) = LENGTH(a.loves))) 
AND 
(NOT HAS (a.likes) OR (LENGTH(FILTER(like IN a.likes WHERE like IN ['kittens','puppies','guppies','manatees'])) > 0)) 
AND 
(NOT HAS (a.hates) OR (LENGTH(FILTER(hate IN a.hates WHERE hate IN ['kittens','puppies','guppies','manatees'])) = 0)) 
RETURN a.name 

Huzzah,Alice和Bob都可以。

但是,是Cypher中最明智的做法嗎?

這當然是一個玩具的例子:在MATCH和其他過濾條件中也會有一個形狀。然而,我的注意力集中在每個形狀可選的人都沒有,一兩個或三個東西[*],其中一個包含必須全部與提供的集合的元素相匹配的元素,其中之一其中ANY必須匹配,並且其中包含NONE必須與(通用)提供的集合中的任何內容匹配的元素。實施這是一項核心要求。我說「事物」而不是「屬性」,因爲我不反對將動物塑造爲節點,並且將我的人與他們聯繫起來。就像這樣,對於卡羅爾和丹來說,他們和阿麗斯和鮑勃一樣,都很喜歡和動物一樣的味道。

CREATE (carol:PERSON {name: 'Carol'})-[:LOVES]->(kittens {name:'kittens'}), 
(carol)-[:LOVES]->(puppies {name:'puppies'}), 
(carol)-[:LIKES]->({name:'guppies'}), 
(carol)-[:LIKES]->({name:'goldfish'}), 
(carol)-[:HATES]->({name:'echidnas'}), 
(dan:PERSON {name: 'Dan'})-[:LIKES]->(kittens), 
(dan)-[:LIKES]->({name:'hamsters'}) 

MATCH (a:PERSON), (a)-[:LOVES]->(a_loves), (a)-[:LIKES]->(a_likes), (a)-[:HATES]->(a_hates) 
WHERE 
ALL (loves_name IN a_loves.name WHERE loves_name IN ['kittens','puppies','guppies','manatees']) 
AND 
ANY (likes_name IN a_likes.name WHERE likes_name IN ['kittens','puppies','guppies','manatees']) 
AND 
NONE (hates_name IN a_hates.name WHERE hates_name IN ['kittens','puppies','guppies','manatees']) 
RETURN a.name 

這適用於每個愛着,喜歡和恨至少一種動物的人,即卡羅爾。然而,當一個人不具備所有三種愛與喜歡和愛的關係時,它不起作用,因爲在圖中沒有找到該形狀,所以它找不到丹。我看不到一個明顯的方法讓OPTIONAL MATCH執行這種修剪。

爲了解決這個問題,我可以添加假動物節點並給予他們每個人的關係,因此: - [:LOVES] - >(獨角獸), - [:LIKES] - >(manticores) - [:HATES] - >(basilisks),然後總是將「獨角獸」添加到與LOVES節點進行比較的集合中。但是,這感覺非常人造和笨重。

很長的文章短,你會喜歡什麼樣的模式在Neo4J和Cypher中,這是什麼?

回答

1

這裏的首次下調http://gist.neo4j.org/?8932364

待辦事項看看,讓我知道,如果首先,這個問題的理解和第二,如果查詢適合。

我想稍後再回來,並改進這個查詢,它很快組合起來。