0

我正在开发一个使用 pyDatalog 查询 sqlite 数据库的程序。数据库中的key表为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 解析前缀谓词时会生成此错误,例如 (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 回答
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 回答