2013-03-11 8 views
1

python의 라이브러리 전구를 사용하여 neo4j에서 데이터를 삽입하고 찾는 데 문제가 있습니다. 문제는 문자 인코딩과 관련이 있습니다. 나는 색인에서 노드를 검색하려고 할 때neo4j, 전구 및 utf8

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 22: ordinal not in range(128) 

을 얻습니다. 나는 전구 중 neo4j에서 문자 인코딩을 변경하는 방법을 찾아 봤지만 그렇게 할 방법을 찾지 못하는 것 같습니다.

from bulbs.model import Node 
from bulbs.neo4jserver import Graph 
from bulbs.property import String 
import MySQLdb 
import sys 


class Topic(Node): 
    element_type = 'node' 
    name = String(nullable=False) 


g = Graph() 
g.add_proxy('topics', Topic) 

con = MySQLdb.connect(host='127.0.0.1', user='root', db='wiki_new', charset='utf8') 
cur = con.cursor() 
cur.execute('SELECT page_title FROM page') 
while True: 
    row = cur.fetchone() 
    if not row: 
     break 

    sys.stdout.write(row[0] + '\n') 
    nds = g.topics.index.lookup(name=row[0]) 
    if not nds: 
     g.topics.create(name=row[0]) 

오류를 발생시키는 문자열은 다음과 같습니다 :! Xóõ

편집 다음은 오류를 재현 한 코드입니다.

내가 파이썬의 SAX 파서를 사용하여, 지금은 (위키피디아 페이지 덤프를) XML 파일에서 데이터를 받고 있어요

UPDATE. 코드는 기본적으로 동일하고, 오류가 나는 얻을 : ATP-toernooi 반 몬트리올/토론토 : 나는 이름을 가진 노드를 만들려고 할 때

File "graph.py", line 197, in <module> 
    build_wikipedia_graph(WIKI_DUMP_PATH) 
    File "graph.py", line 195, in build_wikipedia_graph 
    filter_handler.parse(open(wiki_dump_path)) 
    File "/usr/lib/python2.7/xml/sax/saxutils.py", line 255, in parse 
    self._parent.parse(source) 
    File "/usr/lib/python2.7/xml/sax/expatreader.py", line 107, in parse 
    xmlreader.IncrementalParser.parse(self, source) 
    File "/usr/lib/python2.7/xml/sax/xmlreader.py", line 123, in parse 
    self.feed(buffer) 
    File "/usr/lib/python2.7/xml/sax/expatreader.py", line 207, in feed 
    self._parser.Parse(data, isFinal) 
    File "/usr/lib/python2.7/xml/sax/expatreader.py", line 304, in end_element 
    self._cont_handler.endElement(name) 
    File "/home/pedro/wiki/1.0/page_parser.py", line 55, in method 
    getattr(self._downstream, method_name)(*a, **k) 
    File "/home/pedro/wiki/1.0/page_parser.py", line 87, in endElement 
    self.pageCallBack(self.currentPage, self.callbackArgs) 
    File "graph.py", line 181, in _callback 
    kgraph.set_links_to(page.title, target) 
    File "graph.py", line 59, in set_links_to 
    topic_dst = self._g.topics.get_or_create('name', topic_dst, name=topic_dst) 
    File "/usr/local/lib/python2.7/dist-packages/bulbs/element.py", line 607, in get_or_create 
    vertex = self.index.get_unique(key, value) 
    File "/usr/local/lib/python2.7/dist-packages/bulbs/neo4jserver/index.py", line 335, in get_unique 
    resp = lookup(self.index_name,key,value) 
    File "/usr/local/lib/python2.7/dist-packages/bulbs/neo4jserver/client.py", line 878, in lookup_vertex 
    path = build_path(index_path, vertex_path, index_name, key, value) 
    File "/usr/local/lib/python2.7/dist-packages/bulbs/utils.py", line 126, in build_path 
    segments = [quote(str(segment), safe='') for segment in args if segment is not None] 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 22: ordinal not in range(128) 

오류가 발생합니다.

업데이트 된 전구 라이브러리와 , 나는 다른 오류 얻을 또 다른 갱신 :

File "/usr/local/lib/python2.7/dist-packages/bulbs/utils.py", line 129, in build_path 
    segments = [quote(unicode(segment), safe='') for segment in args if segment is not None] 
    File "/usr/lib/python2.7/urllib.py", line 1238, in quote 
    return ''.join(map(quoter, s)) 
KeyError: u'\xe9' 

어떤 도움을?

감사합니다. Neo4j 서버에서 유니 코드로

+0

그래서 무슨 일이 일어나고 있는지 볼 수있는 예제 코드를 제공하십시오. – espeed

+0

@espeed 노드를 만들 때 같은 오류가 발생하는 일부 코드를 추가했습니다. 감사. – user1491915

+0

감사. 스택의 어디에서 발생했는지 알 수 있도록 전체 오류 메시지를 게시하십시오. – espeed

답변

0

전구를 저장하는 문자열 - (유니 코드 문자열을 파이썬 3의 기본입니다) 유니 코드 값을 캐스트 속성 String 형이주의 사항 :

가 참조 파이썬 유니 코드 HOWTO :

http://docs.python.org/2/howto/unicode.html#python-2-x-s-unicode-support

먼저 확인 MySQL 서버 UTF-8을 지원합니다 :

또한

mysql> show character set like 'utf%';

, 내 변경 사항 및 의견을 알 ...

from bulbs.model import Node 
from bulbs.neo4jserver import Graph 
from bulbs.property import String 
import MySQLdb 
import sys 


class Topic(Node): 
    element_type = 'node'   # by convention name this 'topic' 
    name = String(nullable=False) 


g = Graph() 
g.add_proxy('topics', Topic) 

# Make sure use_unicode to set True 
con = MySQLdb.connect(host='127.0.0.1', user='root', db='wiki_new', use_unicode=True, charset='utf8') 
cur = con.cursor() 
cur.execute('SELECT page_title FROM page') 
while True: 
    row = cur.fetchone() 
    if not row: 
     break 

    sys.stdout.write(row[0] + '\n') 

    # Use Bulbs' get_or_create method to simplify your code 
    nds = g.topics.get_or_create(name, row[0], name=row[0]) 
+0

답장을 보내 주셔서 감사합니다. 데이터 소스가 XML 파일로 변경 되었기 때문에 해당 솔루션을 시도하지 않았지만 여전히 동일한 오류가 발생합니다. 원래 게시물을 참조하십시오. 팁 주셔서 감사! – user1491915