先に進む前に、これが私のデータモデルの表現です。私は今のところNeo4J1.9.2で立ち往生していて、かなり大きなデータベースを持っています(私が知る限り、最大100万ノード、多分それ以下ですが、すべてのデータが取り込まれると時間とともに成長します)。これで、ファセット検索の意味を説明できます。
私のアイテム(documentaryUnit)は、キーワード(さまざまなタイプを持つことができます)にリンクされている場合があります。私が実装したいのは、いくつかのキーワードを選択し、keyword1、keyword2などに接続するための要件に一致するノードがあるかどうかを確認する方法です。ファセット検索の主な目的である別名を実行したくありません。可能性の数を表示し、他の可能性と一致する結果が0の場合はクエリを実行できないようにします。この「単純な」クエリを実行できるようにしたいだけです。私はNeo4Jの世界ではまったく新しいので、以前に答えを見つけようとしましたが、概念的なものが不足しているため、正しい投稿を見逃した可能性があることを覚えておいてください。
だから、これが私が試したクエリです:
START
facet1 = node:entities("__ID__:keyword-104"),
facet2 = node:entities("__ID__:place-1"),
facet3 = node:entities("__ID__:keyword-2"),
facet4 = node:entities("__ID__:keyword-258")
MATCH
(elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet1),
(elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet2),
(elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet3),
(elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet4)
WITH distinct elem, facet1, facet2, facet3, facet4, link
RETURN elem
明確なものの有無にかかわらず、それは時間がかかり、基本的に時々クラッシュします。キーワードが2つしかない場合は、うまく機能します(<100ミリ秒)。3つは長く、4つはクラッシュします(多かれ少なかれ)。外部サービスを使用せずにそれを行う方法を見つける必要があります(アップグレードの理由から、ここではsolrはオプションではありません)。
私が添付した写真を考えると、私が欲しいのは、リンクを介してキーワード1,4,5,3に添付された#1のようなdocumentaryUnitを見つけることです。私もコレクションを試してみました、そうします:
START doc = node:entities("__ISA__:documentaryUnit")
MATCH (doc)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(accessPoints)
WITH collect(accessPoints.__ID__) AS accessPointsId, doc
WHERE ALL (x IN ['keyword-104', 'place-1', 'keyword-2']
WHERE x IN accessPointsId)
RETURN doc.__ID__
これはクラッシュしませんが、開始エントリポイントとして多くのベースノードを取ります。1000ミリ秒から2000ミリ秒かかります。
これを読んでいただきありがとうございます、あなたが何かを投稿したらできるだけ早く返信します
2つの解決策。最良のもの(キャッシュの場合は約500ミリ秒、その後は270ミリ秒):
START
accessPoints = node:entities("__ID__:kw-1 OR __ID__:kw-2 OR __ID__:kw-3 OR __ID__:kw-4")
MATCH
(doc)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->accessPoints
WHERE doc.__ISA__ = "documentaryUnit"
WITH collect(accessPoints.__ID__) AS accessPointsId, doc
WHERE ALL (x IN ['kw-1', 'kw-2', 'kw-3', 'kw-4']
WHERE x IN accessPointsId)
RETURN doc
2番目のものは5000msと400ms後
START
facet1 = node:entities("__ID__:kw-1"),
facet2 = node:entities("__ID__:kw-2"),
facet3 = node:entities("__ID__:kw-3"),
facet4 = node:entities("__ID__:kw-4")
MATCH
(elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet1,
(elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet2,
(elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet3,
(elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet4
WHERE elem.__ISA__ = "documentaryUnit"
RETURN elem
括弧を削除すると、応答が速くなりました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加