用于社交机器人的 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
。
subject
和object
使用最小的数据类型(这里我使用了unsigned int
)。
- 如果谓词字段应该包含一些特定的值,您可以用您自己的
enum
. 替换那个重量级的 std:string
- 你可能已经知道,
std::vector
是一个连续的内存数据结构,每次你insert/remove一个值to/from它,它可能会将整个数组复制到新的地方.所以推荐使用链表
- 如果那些 RDF 条目太多而您的程序的内存无法存储,您应该设置一个文件输出流并将它们保存在磁盘上。
我想以 "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
。 subject
和object
使用最小的数据类型(这里我使用了unsigned int
)。- 如果谓词字段应该包含一些特定的值,您可以用您自己的
enum
. 替换那个重量级的 - 你可能已经知道,
std::vector
是一个连续的内存数据结构,每次你insert/remove一个值to/from它,它可能会将整个数组复制到新的地方.所以推荐使用链表 - 如果那些 RDF 条目太多而您的程序的内存无法存储,您应该设置一个文件输出流并将它们保存在磁盘上。
std:string