2016-04-02 54 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