2016-07-07 81 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

非常感谢,这是一个很大的帮助。 –

相关问题