用于社交机器人的RDF语义网络

RDF semantic network for social robotics

本文关键字:RDF 语义网络 机器人 用于      更新时间:2023-10-16

我想将社交机器人的传入视觉数据以"主语,谓词,宾语"的形式作为RDF三元组保存到语义存储器中。我不确定这种数据结构应该如何在C++中编程。我的第一次尝试是这样的:

class RDFentry {
public:
  int subject;
  std::string predicate;
  int object;
};
std::vector<RDFentry> myrdf = {};
myrdf.push_back({i,"infront",3});

一个示例条目是:"1 infront 3",简称"subect #1 空间关系在对象 #3 的前面"。我的问题是,时间范围缺少一个字段。这个想法不仅存储空间关系,还存储时间信息。另一个问题是,使用第四个时间码字段,RDF数据库中的条目数量会爆炸。在正常的游戏中,每秒生成 30 帧,因此在程序运行一分钟后,语义内存将已满。我如何解决这些问题,是否有任何论文给出了社交机器人背景下RDF三重存储的例子?

添加time字段后,我们得到如下内容:

struct RDFentry {
    unsinged int subject;
    std::string predicate;
    unsinged int object;
    unsinged long time;
};
std::vector<RDFentry> myrdf;
myrdf.emplace_back(i, "infront", 3, /*time*/);

若要提高内存使用率和性能,请注意:

  • 使用 emplace_back 而不是 push_back
  • subjectobject使用最小的数据类型(这里我使用了unsigned int)。
  • 如果谓词字段应该包含一些特定值,则可以将该重量级std:string替换为您自己的enum
  • 您可能已经知道,std::vector是一个连续内存数据结构,每次您在其中插入/删除值时,它都可能会将整个数组复制到新的地方。因此,建议使用链表。
  • 如果这些RDF条目太多,程序的内存可以存储,则应设置文件输出流并将它们保存在磁盘上。