[英]Search keywords in neo4j database by cypher query
我正在網站上並實現搜索過濾器功能。我正在從neo4j數據庫中獲取搜索結果。 我在應用過濾器時遇到問題。問題是當添加搜索時,例如說班加羅爾,我得到10個結果,然后我添加另一個關鍵字,讓開發人員我從整個數據庫中得到結果,但是我想要的結果應該僅來自先前選擇的結果或關鍵字是班加羅爾
我的查詢是:
$data = array (
"query" => "MATCH (x :Job)-[r :POSTED_JOB]-(m) where ( x.city IN {data1} or x.categories or x.sectors IN {data4} or x.role IN {data5} or x.requirement IN {data6}
or x.title IN {data7} or x.description IN {data8})
RETURN m.companyName,x.city",
"params" => array(
"data1" => $city,
"data4" => $sector,
"data5" => $skills,
"data6" => $search,
"data7" => $search,
"data8" => $search
));
如何編寫此查詢以優化結果。
您的查詢充滿了OR
,這意味着當任何一個(該數組包含兩個data5屬性)時, Job
都會匹配。 如果要匹配所有提供的條件,則將OR
替換為AND
。 根據您提供的數據,您可能需要注意NULL值和空列表。
編輯-示例代碼
我認為這是您查詢的一小部分,可能與您所討論的字段匹配。
WHERE x.city IN {data1} OR x.role IN {data5}
它說可以與我在班加羅爾(X)位於班加羅爾(X)的任何節點(x) 或為開發人員角色(X)匹配。 如果您希望查詢僅匹配班加羅爾和開發人員中的記錄,則查詢的該部分應為:
WHERE x.city IN {data1} AND x.role IN {data5}
x.categories似乎也有些擱淺(除了其存在之外,您沒有查詢任何東西)。
編輯-發布聊天
要求是執行連續查詢,其中每個查詢都充當先前結果的過濾器。 所有字段均與每個呼叫重新匹配。 為此,您需要具有一個外部節點標識符,該標識符可用於鏈接查詢,然后將標識符集傳遞到每個后續查詢中。 Cypher中的簡化示例:
初始查詢:
MATCH (j:Job)<-[:POSTED_JOB]-(m)
WHERE j.title=~{searchString} OR j.description=~{searchString}
RETURN j.jobId, j.title, j.description, j.city, m.companyName
后續查詢:
MATCH (j:Job)<-[:POSTED_JOB]-(m)
WHERE j.jobId IN {collectionOfJobIds}
AND (j.title=~{searchString} OR j.description=~{searchString})
RETURN j.jobId, j.title, j.description, j.city, m.companyName
編輯-因為它困擾着我
您可能希望重新匹配每個查詢的數據,因此可以使用過濾器:
MATCH (j:Job)<-[:POSTED_JOB]-(m)
WHERE j.title=~({searchStrings}[0]) OR j.description=~({searchStrings}[0])
WITH m, COLLECT(j) as jobs
WITH m, FILTER (j IN jobs WHERE j.title=~({searchStrings}[1]) OR j.description=~({searchStrings}[1]) as filteredJobs
RETURN m, jobs
這要求將searchStrings作為數組傳入,並且您可以根據需要添加任意數量的WITH(只記得增加數組索引)。 重要的是要意識到,對於所有這些查詢,如果您有很多Job,那么在匹配系統中的所有Job時,它們將變得很慢。 如果您可以對初始比賽設置一些限制,那么您的生活會更好!
旁白:雖然您可以將“城市”,“部門”,“技能”等建模為節點而不是屬性,但您的模型並不是真正的圖形。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.