當然,這是可能的節點或屬性,它的工作原理是相同的:
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
我假設你的意思是由不同的作業數網絡的朋友,不是朋友自己的計數主要排序,這不在這裏真的很有意義;我把它列爲第二類。
謝謝,如果我然後想排序他們有多少共同點。 '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的朋友? –
我已經更新了答案。你的查詢不正確,因爲它引用了一個不存在的「p」(可能是'n'?)。但是由於在查詢中沒有提及朋友的工作,所以它無論如何都不符合你的規範。 –
非常感謝,這是一個很大的幫助。 –