我在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']});
答案 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中更改角色导致的重复结果。