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

RDF semantic network for social robotics

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

class RDFentry {
public:
  int subject;
  std::string predicate;
  int object;
};

std::vector<RDFentry> myrdf = {};
myrdf.push_back({i,"infront",3});

一个示例条目是:"subect #1 spatial relation is infront of object #3" 的缩写“1 infront 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)。
  • 如果谓词字段应该包含一些特定的值,您可以用您自己的 enum.
  • 替换那个重量级的 std:string
  • 你可能已经知道,std::vector是一个连续的内存数据结构,每次你insert/remove一个值to/from它,它可能会将整个数组复制到新的地方.所以推荐使用链表
  • 如果那些 RDF 条目太多而您的程序的内存无法存储,您应该设置一个文件输出流并将它们保存在磁盘上。