ノード間のブール演算を使用したNeo4jクエリ

サラットバーブ

履歴書とスキルのノードを持つグラフ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]

編集
0

コメントを追加

0

関連記事

分類Dev

Neo4JでCypherを使用してノード間の拡張パスをクエリする方法は?

分類Dev

中間ノードを削除し、そのすべての親ノードを子ノードに接続するためのneo4j暗号クエリ

分類Dev

Neo4j + nodejs:javascriptオブジェクトリテラルを使用してノードを作成します

分類Dev

JavaでCypherクエリを使用して、Neo4Jデータベースの2つのノード間に関係を作成できません

分類Dev

暗号を使用してneo4jノードの時間範囲をクエリするにはどうすればよいですか?

分類Dev

Neo4jクエリでのノードのフィルタリング

分類Dev

Neo4jは1次ノード間のエッジを取得します

分類Dev

neo4jノード間のリンク特性を表示する方法

分類Dev

neo4jノードクエリの不一致

分類Dev

neo4jを使用して2つのノード間のルートを見つける方法は?

分類Dev

C#ドライバーを使用したNeo4jクエリの結果の読み取り

分類Dev

直接または間接的に接続されているすべてのノードとリレーションを削除するNeo4jクエリ

分類Dev

neo4jはリンクリストのノードを削除します

分類Dev

Neo4jでノードを作成し、クエリでこのノードを同時に使用するにはどうすればよいですか?

分類Dev

ノード間の特定の関係を見つけるためにNeo4jでクエリを作成する

分類Dev

返されたクエリNeo4jで特定のノードを強調表示する

分類Dev

ノードに複数のインデックスを追加してクエリ時間を短縮-Neo4j

分類Dev

ノードに複数のインデックスを追加してクエリ時間を短縮-Neo4j

分類Dev

Neo4j webadminは、クエリが返すよりも多くのノードを表示します

分類Dev

Neo4j / Cypher-指定された親にのみリンクするノードを検索します

分類Dev

neo4jは子ノードを作成し、それを別の子ノードにリンクします

分類Dev

neo4jの他のノードと同じ関係を持つノード間にリンクリスト関係を作成します

分類Dev

Springデータneo4jとINキーワードを使用したクエリ

分類Dev

neo4jでディープリンクされたノードを効率的にクエリする方法

分類Dev

apocを使用したneo4jの条件付きクエリ

分類Dev

サイファー-「STARTSWITH」を使用して複数のNeo4jノードプロパティフラグメントをクエリする方法

分類Dev

正しいノードおよびそれに関連するその他の情報を取得するためのCypher / Neo4jクエリ

分類Dev

Neo4J Cypher:各ノードの属性/プロパティがクエリに一致した数をカウントします

分類Dev

ノード間の関係を表示するNeo4j

Related 関連記事

  1. 1

    Neo4JでCypherを使用してノード間の拡張パスをクエリする方法は?

  2. 2

    中間ノードを削除し、そのすべての親ノードを子ノードに接続するためのneo4j暗号クエリ

  3. 3

    Neo4j + nodejs:javascriptオブジェクトリテラルを使用してノードを作成します

  4. 4

    JavaでCypherクエリを使用して、Neo4Jデータベースの2つのノード間に関係を作成できません

  5. 5

    暗号を使用してneo4jノードの時間範囲をクエリするにはどうすればよいですか?

  6. 6

    Neo4jクエリでのノードのフィルタリング

  7. 7

    Neo4jは1次ノード間のエッジを取得します

  8. 8

    neo4jノード間のリンク特性を表示する方法

  9. 9

    neo4jノードクエリの不一致

  10. 10

    neo4jを使用して2つのノード間のルートを見つける方法は?

  11. 11

    C#ドライバーを使用したNeo4jクエリの結果の読み取り

  12. 12

    直接または間接的に接続されているすべてのノードとリレーションを削除するNeo4jクエリ

  13. 13

    neo4jはリンクリストのノードを削除します

  14. 14

    Neo4jでノードを作成し、クエリでこのノードを同時に使用するにはどうすればよいですか?

  15. 15

    ノード間の特定の関係を見つけるためにNeo4jでクエリを作成する

  16. 16

    返されたクエリNeo4jで特定のノードを強調表示する

  17. 17

    ノードに複数のインデックスを追加してクエリ時間を短縮-Neo4j

  18. 18

    ノードに複数のインデックスを追加してクエリ時間を短縮-Neo4j

  19. 19

    Neo4j webadminは、クエリが返すよりも多くのノードを表示します

  20. 20

    Neo4j / Cypher-指定された親にのみリンクするノードを検索します

  21. 21

    neo4jは子ノードを作成し、それを別の子ノードにリンクします

  22. 22

    neo4jの他のノードと同じ関係を持つノード間にリンクリスト関係を作成します

  23. 23

    Springデータneo4jとINキーワードを使用したクエリ

  24. 24

    neo4jでディープリンクされたノードを効率的にクエリする方法

  25. 25

    apocを使用したneo4jの条件付きクエリ

  26. 26

    サイファー-「STARTSWITH」を使用して複数のNeo4jノードプロパティフラグメントをクエリする方法

  27. 27

    正しいノードおよびそれに関連するその他の情報を取得するためのCypher / Neo4jクエリ

  28. 28

    Neo4J Cypher:各ノードの属性/プロパティがクエリに一致した数をカウントします

  29. 29

    ノード間の関係を表示するNeo4j

ホットタグ

アーカイブ