2014-03-25 18 views
2

的假設我們有100,000人誰都有屬性,如列表的集合:圖形數據庫技術:情迷度的一致性

height: "between 130 and 140 cm" 
eyecolor: "blue" 
age_rangee: "16-18" 
favorite_music_type: "jazz" 
home_city: "NYC" 
owns_a_boat: "no" 
preferred_flower: "hyacinth" 
bathing_frequency_per_month: 60 
car_type: "minivan" 
house_type: "apartment" 
wears_jeans: "often" 
wears_sandals: "never" 
wears_boots: "sometimes" 

屬性集可以從一定程度上的人有所不同的人。屬性的數量可以改變,屬性的類型可能會改變。當然,這些屬性的價值可能會發生變化。但是,給定一個人,我們假設他的屬性與我們收藏中的許多人有一些重疊。

我的問題是:「在圖表數據庫中表達這些各種屬性的最佳方式是什麼,以便我能夠最快速地選擇一組說50個人的屬性與特定個人的屬性最相似的組,並命令他們從最佳匹配來最差的比賽」

感謝肯尼,

在你的榜樣的Cypher查詢,我明白,每個功能節點都包含一個鍵:值 對標識的屬性和它對應值?

這是一個稍微複雜的同餘匹配問題。

假設我們有一個功能集(A,B,C,D,E,F)和100,000個具有某種程度上與此偏好集相匹配的偏好的人。 但是每個功能,不僅可能有偏好,但他們可能沒有偏好。

例如海倫的偏好,(A,B,C,X,Y,Z),並 羅伯特的偏好,(A,B,C,_,_,),(其中下劃線,( ),意味着任何選擇都可以)

我們願率羅伯特·比莉娜更高的優先匹配方面,因爲在 他和李娜有相同數量的匹配喜好,羅伯特有較少的錯誤匹配優

下面是一個更具體的例子:

讓我們假設我們有10萬人對汽車感興趣,並且我們知道汽車的哪些特徵對他們很重要。 我們有10輛汽車,有不同的功能,我們想選擇一組50個人,他們的最佳汽車功能最佳 與10輛汽車中的每輛車相匹配。

有些人會對所有汽車功能的子集沒有偏好。例如,萊斯特對傳輸沒有偏好,無論是'自動'還是'手動',都會很好, 和Rebecca對'顏色','power_windows'和'power_door_locks'沒有偏好。任何顏色都可以,並且她不關心汽車是否有電動車窗和門鎖。

因此,舉例來說,這裏是一個定義的功能集

engine: '4cylinder' transmission: 'automatic' color: 'dark blue' size: 'subcompact' age: 'less than 4 years' power_windows: 'yes' power_door_locks: 'yes' average_gas_milage: 'greater than 30mpg'

在這裏,我們有兩個人,萊斯特,和麗貝卡誰也表示,是重要的是他們的特點一輛車:

萊斯特: engine: '4cylinder' color: 'dark blue' size: 'subcompact' age: 'less than 4 years' power_windows: 'yes' power_door_locks: 'yes' average_gas_milage: 'greater than 30mpg'

麗貝卡: engine: '4cylinder' transmission: 'automatic' size: 'subcompact' age: 'less than 4 years' average_gas_milage: 'greater than 30mpg'

那麼我們如何才能最好地選擇和定購一組50人的功能偏好與每輛車最匹配? 在這種情況下,我們希望最大匹配特徵首選項的人排名第一, ,但我們也希望包含那些對任何特定屬性值感到滿意的人。

回答

0

偉大的問題。首先,我建議您參加免費的在線培訓課程,熟練地向您介紹Neo4j和Cypher查詢語言背後的基本概念:http://www.neo4j.org/training

您的問題是一個簡單的數據建模練習,我很樂意帶您通讀。在將數據建模爲圖形時,類的某些屬性或屬性(例如某人)可以表示爲節點。

通過查看person類的一些示例數據,您當然會注意到屬性值的一些冗餘。這些重疊使我們能夠通過共享屬性選擇該類和組的結果。這在大多數數據庫中很容易實現。 Neo4j可以讓你做的任何一組功能屬於一個人,然後根據這些共享功能選擇所有類似的人。

MATCH (john:Person {name: "John Doe"})-[:HAS_FEATURE]->(feature), 
     (feature)<-[:HAS_FEATURE]-(people) 
WITH john, count(DISTINCT feature) as feature_count, people 
RETURN john.name, people.name, feature_count 
ORDER BY feature_count DESC 

該查詢找到一個名爲John Doe的人以及屬於他的所有功能。每個功能都是一個代表可以歸因於某個人的值的節點。每個功能都是唯一的,作爲單個節點,並將人員分組在一起。

查詢然後找到所有people誰與john共享feature。然後在WITH子句中,查詢計算john與每個人共享的功能。最後,查詢返回john的名稱,與之共享的人員的姓名以及他們共享的功能的數量。然後查詢按feature_count降序排列。

這會返回與John Doe共享最多功能的人員。

0

另請參閱"Matches are the new Hotness""Match Making with Neo4j"博客文章,瞭解如何將部分子圖節點相互連接的示例。

START me=node:users_index(name={user}) 
MATCH skills<-[:has]-me-[:lives_in]->city<-[:in_location]-job-[:requires]->requirements 
WHERE me-[:has]->()<-[:requires]-job 
WITH DISTINCT city.name AS city_name, 
    job.name AS job_name, 
    LENGTH(me-[:has]->()<-[:requires]-job) AS matching_skills, 
    LENGTH(job-[:requires]->()) AS job_requires, 
    COLLECT(DISTINCT requirements.name) AS req_names, 
    COLLECT(DISTINCT skills.name) AS skill_names 
RETURN city_name, job_name, 
FILTER(name IN req_names WHERE NOT name IN skill_names) AS missing 
ORDER BY matching_skills/job_requires DESC, job_requires 
LIMIT 10 

START me=node:users_index(name={user}) 
MATCH me-[:lives_in]->city<-[:lives_in]-person 
WHERE me.orientation = person.orientation AND 
((me.gender <> person.gender AND me.orientation = "straight") OR 
(me.gender = person.gender AND me.orientation = "gay")) AND 
    me-[:wants]->()<-[:has]-person AND 
    me-[:has]->()<-[:wants]-person 
WITH DISTINCT city.name AS city_name, person, me 
MATCH me-[:wants]->attributes<-[:has]-person-[:wants]->requirements<-[:has]-me 
RETURN city_name, person.name AS person_name, 
    COLLECT(attributes.name) AS my_interests, 
    COLLECT(requirements.name) AS their_interests, 
    COUNT(attributes) AS matching_wants, 
    COUNT(requirements) AS matching_has 
ORDER BY matching_wants/(1.0/matching_has) DESC 
LIMIT 10