gpt4 book ai didi

sql - 使用 Perl 的高效语义三元组,无需外部数据库服务器

转载 作者:行者123 更新时间:2023-12-04 21:41:52 24 4
gpt4 key购买 nike

我有几个语义三元组。一些例子:

Porky,species,pig // Porky's species is "pig" 
Bob,sister,May // Bob's sister is May
May,brother,Sam // May's borther is Sam
Sam,wife,Jane // Sam's wife is Jane
... and so on ...

我将每个三元组存储在 6 个不同的哈希中。例子:
$ijk{Porky}{species}{pig} = 1; 
$ikj{Porky}{pig}{species} = 1;
$jik{species}{Porky}{pig} = 1;
$jki{species}{pig}{Porky} = 1;
$kij{pig}{Porky}{species} = 1;
$kji{pig}{species}{Porky} = 1;

这让我可以有效地提出以下问题:
  • pig 肉是什么品种(keys %{$ijk{Porky}{species}})
  • 列出所有 pig (keys %{$jki{species}{pig}})
  • 我有什么关于 Porky 的信息? ( keys %{$ijk{Porky}} )
  • 列出所有物种 ( keys %{$jik{species}} )

  • 等等。请注意,上面的示例都没有一次遍历一个元素的列表。他们都“立即”接受了我的回答。换句话说,每个答案都是一个哈希值。当然,答案本身可能是一个列表,但我不会遍历任何列表来获得该答案。

    但是,定义 6 个单独的哈希值似乎真的很低效。有没有
    不使用外部数据库引擎的更简单方法
    (对于这个问题,SQLite3 算作外部数据库引擎)?

    还是我只是将一小部分 SQL 复制到 Perl 中?

    编辑:我想我想说的是:我喜欢关联数组,但它们似乎是这项工作的错误数据结构。什么是正确的数据结构,以及 Perl 模块实现它?

    最佳答案

    你看过使用RDF::Trine ?它有 DBI 支持的存储,但它也有内存中的存储,如果您需要持久性,它可以在 RDF/XML、Turtle、N-Triples 等中解析/序列化。

    例子:

    use strict;
    use warnings;
    use RDF::Trine qw(statement literal);

    my $ns = RDF::Trine::Namespace->new("http://example.com/");
    my $data = RDF::Trine::Model->new;

    $data->add_statement(statement $ns->Peppa, $ns->species, $ns->Pig);
    $data->add_statement(statement $ns->Peppa, $ns->name, literal 'Peppa');
    $data->add_statement(statement $ns->George, $ns->species, $ns->Pig);
    $data->add_statement(statement $ns->George, $ns->name, literal 'George');
    $data->add_statement(statement $ns->Suzy, $ns->species, $ns->Sheep);
    $data->add_statement(statement $ns->Suzy, $ns->name, literal 'Suzy');

    print "Here are the pigs...\n";
    for my $pig ($data->subjects($ns->species, $ns->Pig)) {
    my ($name) = $data->objects($pig, $ns->name);
    print $name->literal_value, "\n";
    }

    print "Let's dump all the data...\n";
    my $ser = RDF::Trine::Serializer::Turtle->new;
    print $ser->serialize_model_to_string($data), "\n";

    RDF::Trine 是一个相当大的框架,所以有一点编译时的损失。在运行时,它虽然相对较快。

    如果您希望使用 SPARQL 查询数据,RDF::Trine 可以与 RDF::Query 结合使用。
    use RDF::Query;

    my $q = RDF::Query->new('
    PREFIX : <http://example.com/>
    SELECT ?name
    WHERE {
    ?thing :species :Pig ;
    :name ?name .
    }
    ');

    my $r = $q->execute($data);

    print "Here are the pigs...\n";
    while (my $row = $r->next) {
    print $row->{name}->literal_value, "\n";
    }

    RDF::Query 支持 SPARQL 1.0 和 SPARQL 1.1。 RDF::Trine 和 RDF::Query 都是由 Gregory Williams 编写的,他是 SPARQL 1.1 工作组的成员。 RDF::Query 是在 SPARQL 1.1 Query 测试套件上实现 100% 的首批实现之一。 (它甚至可能是第一个?)

    关于sql - 使用 Perl 的高效语义三元组,无需外部数据库服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24664429/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com