Cypher匹配具有多个属性的集合

时间:2016-04-02 07:07:56

标签: neo4j cypher

我在neo4j中创建了4个节点,这些节点具有名称和技能作为属性。如何使用CQL查找具有一个或多个相似技能的节点。

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 个答案:

答案 0 :(得分: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在traversion中更改角色导致的重复结果。