2016-04-02 7 views
0

名前とスキルを持つプロパティーを持つneo4jに4つのノードを作成しました。CQLを使用して1つ以上の類似スキルを持つノードを見つける方法。複数のプロパティを持つコレクションのサイファー一致

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の関係で接続されています。あなたのグラフはその1で行うことができますリファクタリング

:新しいモデルに基づいて

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

関連する問題