1

Python のライブラリ バルブを使用して、neo4j からデータを挿入および検索する際に問題が発生しています。問題は文字エンコーディングに関係しています。私は得る:

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óõ です。

アップデート

Python の sax パーサーを使用して、XML ファイル (ウィキペディアのページ ダンプ) からデータを取得しています。コードは基本的に同じで、エラーは次のとおりです。

  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)

atp-toernooi van montréal/toronto という名前のノードを作成しようとすると、エラーが発生します。

の更新更新された電球ライブラリでは、別のエラーが発生します。

  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'

何か助けはありますか?

ありがとう!

4

1 に答える 1

0

Bulbsは文字列をNeo4jサーバーにUnicodeとして格納します-プロパティタイプStringが値をUnicodeにキャストすることに注意してください(Unicode文字列はPython 3のデフォルトです):

PythonUnicodeHOWTOを参照してください。

http://docs.python.org/2/howto/unicode.html#python-2-xs-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]) 
于 2013-03-12T15:21:48.293 に答える