2014-04-14 3 views
1

bulbsrexster을 사용하고 있으며 유니 코드 속성을 가진 노드를 저장하려고합니다 (아래 예 참조). Rexster (Rexster Dog House)와 함께 제공되는 웹 인터페이스의 노드를 볼 수 있지만 동일한 노드를 검색하는 것이 작동하지 않는 것처럼 그래프의 노드를 생성하는 것이 올바르게 작동합니다. 모든 것은 None입니다.Rexster + Bulbs : 유니 코드 노드 속성 - 노드가 생성되었지만 찾을 수 없음

해당 속성에 유니 코드가 아닌 문자가 포함 된 노드를 만들고 찾을 때 모든 것이 예상대로 작동합니다. 예. 다음 예에서 name = u'University of Cambridge' 인 노드는 예상대로 검색 할 수 있습니다.

Rexster 버전 :

[INFO] Application - Rexster version [2.4.0] 

예제 코드 :

# -*- coding: utf-8 -*- 


from bulbs.rexster import Graph 
from bulbs.model import Node 
from bulbs.property import String 
from bulbs.config import DEBUG 
import bulbs 

class University(Node): 
    element_type = 'university' 
    name = String(nullable=False, indexed=True) 


g = Graph() 
g.add_proxy('university', University) 
g.config.set_logger(DEBUG) 

name = u'Université de Montréal' 

g.university.create(name=name) 

print g.university.index.lookup(name=name) 

print bulbs.__version__ 

명령 행에서 다음과 같은 출력 제공합니다 :

POST url: http://localhost:8182/graphs/emptygraph/tp/gremlin
POST body: {"params": {"keys": null, "index_name": "university", "data": {"element_type": "university", "name": "Universit\u00e9 de Montr\u00e9al"}}, "script": "def createIndexedVertex = {\n vertex = g.addVertex()\n index = g.idx(index_name)\n for (entry in data.entrySet()) {\n if (entry.value == null) continue;\n vertex.setProperty(entry.key,entry.value)\n if (keys == null || keys.contains(entry.key))\n\tindex.put(entry.key,String.valueOf(entry.value),vertex)\n }\n return vertex\n }\n def transaction = { final Closure closure ->\n try {\n results = closure();\n g.commit();\n return results; \n } catch (e) {\n g.rollback();\n throw e;\n }\n }\n return transaction(createIndexedVertex);"} GET url: http://localhost:8182/graphs/emptygraph/indices/university?value=Universit%C3%A9+de+Montr%C3%A9al&key=name
GET body: None None 0.3

답변

2

확인을, 나는 마침내 바닥에 도착 이의.

TinkerGraph는 인덱스에 HashMap을 사용하기 때문에 Gremlin을 사용하여지도 내용을 반환함으로써 인덱스에 저장되는 내용을 볼 수 있습니다. 인코딩이 제대로 보이지 -

여기

{"results":[{"name":{"Université de Montréal":[{"name":"Université de Montréal","element_type":"university","_id":"0","_type":"vertex"}]},"element_type":{"university":[{"name":"Université de Montréal","element_type":"university","_id":"0","_type":"vertex"}]}}],"success":true,"version":"2.5.0-SNAPSHOT","queryTime":3.732632} 

$ curl http://localhost:8182/graphs/emptygraph/tp/gremlin?script="g.idx(\"university\").index" 

잘 보이는 모든 ... 당신의 전구 위 g.university.create(name=name) 방법을 사용하여 TinkerGraph 지수에 저장되는 무슨이다.

Bulbs는 위와 같은 버텍스를 만들고 색인을 생성하기 위해 JSON 콘텐츠 유형이있는 HTTP POST 요청을 통해 사용자 정의 Gremlin 스크립트를 사용합니다.

여기

Rexster의 인덱스 조회 REST 엔드 포인트

이 URL의 검색어 매개 변수를 사용하여 ... 문제, 그리고 전구는 UTF-8 바이트 문자열로 URL의 PARAMS을 인코딩합니다.

Rexster이 UTF-8 바이트 문자열로 인코딩 된 URL의 검색어 매개 변수를 처리하는 방법을 보려면, 단순히 인코딩 된 문자열을 반환하는 URL 쿼리 PARAM 통해 그렘린 스크립트 ...

$ curl http://localhost:8182/graphs/emptygraph/tp/gremlin?script="'Universit%C3%A9%20de%20Montr%C3%A9al'" 
{"results":["Université de Montréal"],"success":true,"version":"2.5.0-SNAPSHOT","queryTime":16.59432} 

Egad

을 실행 ! 그건 맞지 않습니다. 보시다시피, 그 텍스트는 엉망입니다.

아이러니 한 느낌이 들기 때문에 Gremlin이 gremlins를 반환합니다. Rexster가 인덱스 조회에서 키 값으로 사용하고있는 것은 TinkerGraph의 HashMap 인덱스에 저장된 것이 아닙니다.

다음은 무슨 일입니까?

이는 인용되지 않은 바이트 스트링 전구의 모습이다

>>> name 
u'Universit\xe9 de Montr\xe9al' 

>>> bulbs.utils.to_bytes(name) 
'Universit\xc3\xa9 de Montr\xc3\xa9al' 

'\xc3\xa9' (또한 u'\u00e9'으로 지정 될 수 있음)은 유니 코드 문자의 u'\xe9' UTF-8 인코딩된다.

UTF-8은 문자 인코딩에 2 바이트를 사용하고 Jersey/Grizzly 1.x (Rexster의 앱 서버)는 UTF-8과 같은 2 바이트 문자 인코딩을 제대로 처리하지 못하는 버그가 있습니다.

그것은이 저지/그리즐리 2.0에서 해결 된 것처럼 보이지만, 뉴저지/뉴저지/그리즐리 2.X에 그리 즐 1.x에서에서 Rexster 스위칭 큰 시련이다 http://markmail.org/message/w6ipdpkpmyghdx2p

를 참조하십시오.

지난해 TinkerPop은 Netty로 전환하기로 결정 했으므로 올 여름 TinkerPop 3 릴리스에서 Rexster는 Grizzly가 아닌 Netty를 기반으로하는 Gremlin Server로 변신 중입니다.

그때까지, 여기에 몇 가지 해결 방법이 있습니다 ...

그리 즐은 UTF-8과 같은 2 바이트 인코딩을 처리 할 수 ​​없기 때문에, 클라이언트 라이브러리는 AKA ISO-(1 바이트 라틴 인코딩과 같은 URL의 PARAMS을 인코딩해야 8859-1), Grizzly의 기본 인코딩입니다.

여기

$ curl http://localhost:8182/graphs/emptygraph/tp/gremlin?script="'Universit%E9%20de%20Montr%E9al'" 
{"results":["Université de Montréal"],"success":true,"version":"2.5.0-SNAPSHOT","queryTime":17.765313} 

당신이 라틴 인코딩이 경우 작동 사용하여 볼 수 있듯이 ... 라틴 바이트 문자열로 인코딩 같은 값입니다.

그러나 일반적인 목적을 위해 클라이언트 라이브러리가 JSON 콘텐츠 유형의 HTTP POST 요청을 통해 맞춤 Gremlin 스크립트를 사용하는 것이 가장 좋으며 따라서 URL 매개 변수 인코딩 문제를 모두 피할 수 있습니다. 이것이 바로 Bulbs가 진행하는 것입니다. 할 것이다. 그리고 나는 나중에 GitHub에 전구 업데이트를 밀어 넣을 것이다.

UPDATE : 그것은 우리가 그리즐리의 기본 인코딩 유형을 변경할 수 있지만, 우리는 HTTP 요청 Content-Type 헤더에 문자 집합으로 UTF-8을 지정할 수 있습니다 그리즐리이 그것을 사용하는 것으로 나타났다. Bulbs 0.3.29가 요청 헤더에 UTF-8 charset을 포함하도록 업데이트되었으며 모든 테스트가 통과되었습니다. 업데이트가 GitHub와 PyPi 모두에 푸시되었습니다.