2017-12-10 14 views
3

일종의 와일드 카드 검색에서 정점을 검색하려고합니다. SQL에서는 다음과 같을 것입니다. " '% abc %'와 같은 이름" ". Gremlin 그래프 탐색이나 SQL 쿼리가 지원하지 않습니다.Gremlin 그래프 API를 사용하여 azure cosmos db에서 와일드 카드 또는 "LIKE"검색

사용 사례는 1 : n 의존성을 필터링하는 것입니다. "샘이 들어있는 모든 고객을 보여주십시오." 이것은 매우 기본적이고 SQL로 쉽습니다. 전체 텍스트 검색이 아니라 특정 1 : n 관련성에 대한 필터입니다.

다음 SQL 작품 :

SELECT * FROM g 
    where (g.label = "person" and g.name[0]._value = 'Sam') 

하는 것과 같습니다

g.V().hasLabel("person").has("name", "Sam") 

SQL이 작동하지 않습니다 다음 ("구문 오류, 근처 '와 같은'잘못된 구문) :

SELECT * FROM g 
    where (g.label = "person" and g.name[0]._value like 'Sam') 

Gremlin "필터"단계에서 람다를 사용하면 오류가 발생합니다.

이러한 종류의 검색을 위해 UDF 또는 기타 저장 프로 시저를 작성하는 것이 좋습니다. 이 경우 인덱싱은 어떻게 처리됩니까? 대안이 있습니까?

덕분에 많은

+0

솔루션에 가까워 졌습니까? 필터를 조사하고 있었지만 클로저가 지원되지 않는 것 같습니다. –

답변

0

내가 일치 하늘빛의 놈아의 구현 및 퍼지 에 대한이 벽돌 벽 제한을 명중 너무

이 단계에서 취할 수있는 방법의 몇 가지 있지만, 가장 좋은 방법은있다 당신의 목표와 제약에 달려있다. 이것들이 약간의 영감을 주길 바란다 ...

이것을 진행할 수있는 한 가지 방법은 저장소/데이터 액세스 레이어에 캐싱 레이어를 구현하고 코드를 사용하여 메모리 내장 콜렉션을 쿼리하는 것이다.

,

또 다른 옵션은, 당신이 검색 될 패턴의 복잡성에 따라서 (효과적으로 정확도 수준에 하강한다) 세그먼트로 아래로 이름을 깨고

일예 이름의 부품 자유롭게 검색하는 것입니다

이름 = 샘 스미스

속성 :

FIRSTNAME = 샘,

FirstNameInitial = S,

성 = 스미스,

LastnameInitial = S

Init Da TA

g.addV('Person').property('Firstname', 'Sam').property('FirstnameInitial', 'S').property('Lastname', 'Smith').property('LastnameInitial', 'S') 

조회 데이터

g.V().has('label', 'Person').has('Firstname', 'Sa').has('Lastname', 'Smit').fold().coalesce(
    unfold(), 
    g.V().has('label', 'Person').has('FirstnameInitial', 'S').has('Lastname', 'Smit'), 
    g.V().has('label', 'Person').has('Firstname', 'Sam').has('LastnameInitial', 'S'), 
    g.V().has('label', 'Person').has('FirstnameInitial', 'S').has('LastnameInitial', 'S') 
) 

합체는 제 비어 세트를 반환 쉼표 위해 용어를 구분 평가한다. 이 방법을 접기 및 펼치기와 함께 사용하면 첫 번째 용어 (.fold(). coalesce())가 병합 성명에 의 unfold()를 통해 첫 번째로 반환됩니다. 쉼표로 구분 된 쿼리를 순서대로 수행합니다.

이렇게하면 검색을 매우 구체적으로 시작하고보다 일반적인 검색으로 넘어갈 가능성이 있습니다. 분명히 개념을 가져 와서 '성 2 초기', '성 3 초기'등을 포함하도록 발전시킬 수 있습니다.