2016-04-02 59 views
0

我已經在neo4j中創建了4個名稱和技能爲其屬性的節點。如何使用CQL查找具有一個或多個相似技能的節點。Cypher匹配具有多個屬性的集合

CREATE 
(c1:Person {name:'a',skills:['Java','Apache Hadoop','Apache Storm','Apache Solr','Hbase','Map-reduce','Spring']}), 
(c2:Person {name:'b',skills:['Java','HTML5','LifeRay','MYSQL']}), 
(c3:Person {name:'c',skills:['HTML5','LifeRay','MYSQL']}), 
(c4:Person {name:'d',skills:['Java','Apache Hadoop','Apache Storm','Apache Solr','Hbase','Map-reduce']}); 

回答

1

您應該在這裏重構您的數據模型。您的使用案例是「查找共享相同技能的人員」 - 因此技巧是您域中的「事物」,因此它應該是一個節點,而不是將信息隱藏在屬性中。具有技能的人通過HAS_SKILL關係連接到該節點。

重構你的圖表可以與之一進行:

match (p:Person) 
foreach (s in p.skills | 
    merge (skill:Skill {name:s}) 
    merge (p)-[:HAS_SKILL]->(skill) 
) 
remove p.skills 

基礎上的新模式,具有類似人的技能,查詢很簡單:

match (p1:Person)-[:HAS_SKILL]->(s:Skill)<-[:HAS_SKILL]-(p2:Person) 
where id(p1)<id(p2) 
return p1.name, p2.name, s.name 

where條件來防止由於p1和p2在結果中改變角色而導致重複結果。

+0

現在我有了一些想法,將技能建模爲單獨的節點,然後找到類似的技能。這意味着技能不應該是人的財產,它應該是單獨的節點。 – PrasoonMishra