当然,这是可能的节点或属性,它的工作原理是相同的:
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'?)。但是由于在查询中没有提及朋友的工作,所以它无论如何都不符合你的规范。 –
非常感谢,这是一个很大的帮助。 –