[英]Gremlin case insensitive search
我是 Gremlin 的新手,我正在使用 Gremlin 控制台從圖形數據庫中讀取數據。 在圖中,有 label “設備”的頂點。 這些頂點有一個與之關聯的屬性“名稱”。 我需要找出是否有一個具有特定名稱的頂點。 此檢查必須不區分大小寫。
假設我要在關系數據庫中執行此操作,我可以編寫以下查詢:
SELECT * FROM device d WHERE LOWER(d.name) = 'mydevice'
我正在尋找與 Gremlin 中的“LOWER”類似的 function。 如果沒有 function ,有人可以告訴我如何在不考慮字母大小寫的情況下搜索頂點的屬性嗎?
謝謝你。
正式地,Gremlin 目前只有三個由TextP
公開的文本謂詞: startingWith
、 endingWith
和 contains(以及它們containing
否定),但它們的默認實現區分大小寫:
gremlin> g.V().has('person','name',containing('ark')).values('name')
==>marko
gremlin> g.V().has('person','name',containing('Ark')).values('name')
gremlin>
根據您使用的啟用 TinkerPop 的圖形數據庫,您可能擁有此類功能以及其他更高級的搜索選項(例如正則表達式)。 例如,JanusGraph 支持不區分大小寫的全文搜索以及許多 其他選項。 DS Graph 在基本的 Gremlin 選項之上還有一個富文本搜索系統。 因此,如果您明確需要您描述的搜索類型,您可能需要查看各個圖形系統提供的選項。
雖然出於多種原因不建議您使用 lambda:
gremlin> g.V().filter{it.get().value('name').toUpperCase() == 'MARKO'}.values('name')
==>marko
lambdas 的缺點是:
TinkerPop 正在慢慢識別不同供應商提供的搜索選項之間的共性,並將在機會出現時繼續推廣這些功能,以便它們可以作為 Gremlin 語言本身的一等公民使用。
我只是遇到了同樣的問題,但找到了一個可以接受的解決方案(至少對我來說)
String search = "any"
g.V().hasLabel(label)
.as("V")
.properties(prop1, prop2, ...)
.or(
// Use fuzzy search with 1 to allow swapped chars
hasValue(tokenFuzzy(search, 1)),
// Search for exact contain match
hasValue(containing(search)),
// Search for incase sensitive start with
hasValue(tokenPrefix(search))
)
.select("V")
.dedup()
當我現在搜索“ger”或“any”時,我會得到“德國目前天氣晴朗”。
在我使用properties
之前,我使用as
來存儲我當前的頂點,因為這只會留下選定的道具,但我想要搜索后的完整頂點。
此外,我需要重復數據刪除,因為可能會在prop1
和dedup
中進行命中, prop2
導致重復發現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.