0

私は、pyDatalog を使用して sqlite データベースを照会するプログラムに取り組んでいます。データベースのキー テーブルは Event で、次のように定義されています。

class Event(Base):
  __tablename__ = 'Event'

  id = Column('id', Integer, primary_key = True)
  eventType = Column('eventType', Integer, ForeignKey('EventType.id'))
  dateTime = Column('dateTime', DateTime)

  def __init__(self, eventType, dateTime):
    self.eventType = eventType
    self.dateTime = dateTime

  def __repr__(self):
    return "<Event(%d, %d, %s)>" % (self.id, self.eventType, self.dateTime)

その後、各イベントは詳細テーブルを参照して詳細情報を表示します。

私ができるようにしたいのは、シーケンス内の各イベントに対して一連のクエリを実行することです。ルールセットは、pyDatalog.load() を使用して外部ファイルからロードされます。

私が問題を抱えている部分は、各イベント ID への参照を Python からデータログに渡すことです。「TypeError: オブジェクトは照会されたクラスと互換性がありません」というエラーが表示され続けます。

デバッグのために、ルールを次のように減らしました。

+ parent(bill, 'John Adams')
ancestor(X,Y) <= parent(X,Y)
ancestor(X,Y) <= parent(X,Z) & ancestor(Z,Y)

getEvent(EvtId, Evt) <= (Event.id[Evt] == EvtId)

クエリを実行するコードは次のようになります (より大きなクラスの一部)。

def validateEvent(self, event):
  # validate the event instance 'event'
  print "validating event: %s" % (event)
  #query = 'parent(bill, X)'
  query = 'getEvent(' + str(event.id) + ', Evt)'
  print query
  print pyDatalog.ask(query)

「query='parent(bill,X)'」行のコメントを外すと、問題なく動作します ((bill, 'John Adams') タプルを出力します) が、「query = 'getEvent(...」行で、上記の最後の行で上記のエラーで失敗し続けます。

このエラーの意味と、イベント ID への参照を pyDatalog に正しく渡す方法を知っている人はいますか?

4

2 に答える 2

0

ドキュメントを読み直すことで、これを解決することができました。を使用して、pyDatalog 機能を基本クラスに追加しました。

Base = declarative_base(cls=pyDatalog.Mixin, metaclass=pyDatalog.sqlMetaMixin)

また、セッションを基本クラスに関連付ける必要があります。

Session = sessionmaker(bind=engine)
session = Session()
Base.session = session

これを修正すると、上記の例は正しく機能します。

于 2013-08-28T08:09:43.387 に答える
0

このエラーは、pyDatalog が (Event.id[Evt] == EvtId) などのプレフィックス付きの述語を解析するときに生成されます。これは、Evt が Event のインスタンスでも、pyDatalog 変数でもないことを意味します。

したがって、このインライン pyDatalog ステートメントでエラーが発生すると想像できます。

getEvent(EvtId, Evt) <= (Event.id[Evt] == EvtId)

この行でエラーが発生する方法を説明できません (pyDatalog 0.13 を使用):

print pyDatalog.ask(query)
于 2013-08-27T21:01:00.907 に答える