在图表中查找具有相似邻居的节点

时间:2016-07-07 10:27:44

标签: neo4j cypher

我一直在研究不同的推荐脚本(moviesocial)。

我想获取具有一定数量的相同类型的邻居的节点。 让我们说:

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

我们是否找到了与彼得共享同一类型朋友的其他机制。

EG。 Mechanic-TruckDriver,Mechanic-Priest,Mechanic-CarSalesPerson。

据我所知,我可以使用Job作为节点,如示例所示。

但是我的问题是,作为节点Person上的属性是否有可能?

因为我希望能够生成一个说明人和工作的列表,如果它不是属性,我将不得不为每个人做一个额外的查询。

1 个答案:

答案 0 :(得分: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

我认为你的意思主要是根据朋友网络中不同工作的数量来排序,而不是朋友自己的数量,这在这里看起来并不重要;我将它作为次要类别包括在内。