2016-07-07 63 views
0

我一直在尋找不同的建議書腳本(movie,social)。在圖中找到具有相似鄰居的節點

我想獲取具有一定數量的相同類型的鄰居的節點。 比方說:

(n:Person {name:Peter, job:Mechanic}) 

難道我們發現,共享同一類型的朋友,彼得其他機制。

例如,機械 - 卡車司機,機械師,機械師 - CarSalesPerson。

據我可以看到,我可以使用作爲一個節點作爲例子中做它。

然而,我的問題是,是否有可能作爲一個屬性在節點Person作業?

因爲我希望能夠生成一個可以說人和工作的列表,如果它不是一個屬性,我將不得不爲每個人做額外的查詢。

回答

1

當然,這是可能的節點或屬性,它的工作原理是相同的:

MATCH (p1:Person {name: "Peter", job: "Mechanic"})-[:HAS_FRIEND]-(n), 
     (p2:Person {job: "Mechanic"})-[:HAS_FRIEND]-(n) 
WHERE p1 <> p2 
RETURN p2 
LIMIT 10 

VS

MATCH (job:Job {name: "Mechanic"}), 
     (job)<-[:HAS_JOB]-(p1:Person {name: "Peter")-[:HAS_FRIEND]-(n), 
     (job)<-[:HAS_JOB]-(p2:Person)-[:HAS_FRIEND]-(n) 
WHERE p1 <> p2 
RETURN p2 
LIMIT 10 

這是指定Person和工作之間的聯繫只是一種不同的方式,通過財產或關係。

但無論哪種方式,您都會對每個人有一個「額外查詢」:當您訪問節點時,默認情況下都不會提取屬性或關係。


更新:這個問題是不是朋友 - 的 - 朋友有相同的工作的第一人,但其他人同樣的作業,以有朋友與同樣的工作的朋友的第一人第一個人(!)。所以專業的朋友網絡也是如此。

job財產去,這將是:

MATCH (p1:Person {name: "Peter", job: "Mechanic"})-[:HAS_FRIEND]-(f) 
WITH p1, collect(DISTINCT f.job) AS friendJobs 
MATCH (p2:Person)-[:HAS_FRIEND]-(f) 
WHERE p2 <> p1 
    AND p2.job = p1.job 
    AND f.job IN friendJobs 
RETURN p2, count(DISTINCT f.job) AS jobs, count(f) AS friends 
ORDER BY jobs DESC, friends DESC 
LIMIT 10 

我假設你的意思是由不同的作業數網絡的朋友,不是朋友自己的計數主要排序,這不在這裏真的很有意義;我把它列爲第二類。

+0

謝謝,如果我然後想排序他們有多少共同點。 'MATCH(p1:Person {name:「Peter」,job:「Mechanic」}) - [:HAS_FRIEND] - (n),(p2:Person {job:「Mechanic」}) - [p:HAS_FRIEND] - (n)WITH p1,p2,count(p)as pC WHERE p1 <> p2 AND pC> 2 RETURN p2 LIMIT 10'是否正確? 只是爲了澄清,我不是指comon中的朋友,而是comon中的朋友的職業。機械師 - 牧師,機械師 - TruckDriver。上面的查詢會從'n'中抓到這個還是隻有comon的朋友? –

+0

我已經更新了答案。你的查詢不正確,因爲它引用了一個不存在的「p」(可能是'n'?)。但是由於在查詢中沒有提及朋友的工作,所以它無論如何都不符合你的規範。 –

+0

非常感謝,這是一個很大的幫助。 –

相關問題