履歴書とスキルのノードを持つグラフDBがあります。スキルノードにはプロパティ「名前」が含まれています。Java、Cなどのサンプル値があります...
そして、ResumeノードとSkillノードの間に関係has_skillを作成しました。また、各再開ノードには、has_skillの関係を持つ任意の数のスキルノードを含めることができます。
ここで、次のブール条件を満たすすべての再開ノードを取得します。
((JAVA AND MYSQL) OR (C AND MSSQL)) AND HTML
次のクエリを試しました
match(n:Skill)--(n1:PannaResume)
where ((n.name contains "java" AND n.name contains "mysql")
OR (n.name contains "c" AND n.name contains "mssql"))
AND n.name contains "html"
return n1
しかし、これは期待される結果をもたらしていません。正しいクエリを提案してください。
同時に少なくとも3つのスキルを持つスキルを持っている人を見つけるようにNeo4jに要求しているため、クエリは失敗しています。明らかに、スキルnが与えられると、javaとmysqlとhtmlになることはありません。(javaeeやjava 8など、スキル名に追加された可能性のあるバージョン情報を「ストリップ」するためにcontainsを使用していると仮定します。これもjavascriptと一致することを覚えておいてください。ただし、このデータをNeo4jに取得することをお勧めします。一般名を別のフィールドに解析してもらいます。名前をスキル配列として扱っている場合は、おそらく一致するものがなく、スキームが脆弱すぎて有用なことは何もできません)
Neo4jが有効なスキルノードをチェックするように、この一致パターンをお勧めします
MATCH (n:Skill)<--(n1:PannaResume)
WITH n1, COLLECT(n.name) as skills
WHERE ANY(name in skills WHERE name contains "html")
AND (ANY(name in skills WHERE name contains "java")
OR ANY(name in skills WHERE name contains "mysql")
)
OR (
(ANY(name in skills WHERE name contains "c")
OR ANY(name in skills WHERE name contains "mssql")
))
もちろん、より明確な方が良いです。これにより、パフォーマンスが大幅に向上します。
MATCH (n1:PannaResume)-[:has_skill]->(:Skill {name : "html"})
WHERE ((n1)-[:has_skill]->(:Skill {name : "java"}) AND (n1)-[:has_skill]->(:Skill {name : "mysql"}))
OR ((n1)-[:has_skill]->(:Skill {name : "c"}) AND (n1)-[:has_skill]->(:Skill {name : "mssql"}))
RETURN n1
ただし、クエリを一連の個別のクエリに分割し、次のように結果を結合することで、少し単純化することもできます(Cypherプランナーで簡単にできます)。
MATCH (n1:PannaResume)-[:has_skill]->(:Skill {name : "html"})
WHERE (n1)-[:has_skill]->(:Skill {name : "java"})
AND (n1)-[:has_skill]->(:Skill {name : "mysql"})
RETURN n1
UNION
MATCH (n1:PannaResume)-[:has_skill]->(:Skill {name : "html"})
WHERE (n1)-[:has_skill]->(:Skill {name : "c"})
AND (n1)-[:has_skill]->(:Skill {name : "mssql"})
RETURN n1
これは前のクエリと同等であるはずですが、実行していること/ Neo4jのバージョンによってはより効率的な場合があります。WITHはクエリをさまざまな段階に分割するため、Cypherプランナーは最初にスキルノードを見つけてから、それらのスキルに関連する人物を見つけるように強制されます。
MATCH (html:Skill {name : "html"}), (java:Skill {name : "java"}), (c:Skill {name : "c"}), (mysql:Skill {name : "mysql"}), (mssql:Skill {name : "mssql"})
WITH *
MATCH (n1:PannaResume)-[:has_skill]->(html)
WHERE ((n1)-[:has_skill]->(java) AND (n1)-[:has_skill]->(mysql)
OR ((n1)-[:has_skill]->(c) AND (n1)-[:has_skill]->(mssql)
RETURN n1
効率を心配する必要がある場合は、PROFILEキーワードを使用してさまざまな要件を試す必要があります。あなたがやろうとしている重要なことは、クエリの各「ステージ」が生成する行数を最小限に抑えることです。それ以降のすべてのステージは、前のステージが生成した行数で乗算されるためです。(Cypherプランナーは、複数のクエリを並行して実行し、それらの共通部分を見つけることができます。したがって、Cypherへの変更がプランにどのように影響するかは明らかではありません。PROFILEはクエリの非効率性を示すため、次の手順に注意してください。 dbhitが高いか、行が多くなります。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加