FedoraCommons存储库平台的API实现

fcrepo的Python项目详细描述


fcrepo,Fedora Commons Repository的客户机

信息

此软件包提供对Fedora Commons存储库的访问。

来自Fedora Commons网站:

< Buff行情> fedora(flexible extensible digital object repository architecture)最初是康奈尔大学(cornell university)的研究人员根据kahn和wilensky框架开发的一种以数字对象的形式存储、管理和访问数字内容的架构。Fedora定义了一组抽象,用于表示数字对象、断言数字对象之间的关系以及将"行为"(即服务)链接到数字对象。Fedora Repository项目(即Fedora)在一个健壮的开源软件系统中实现Fedora抽象。

这个包使用wadl, web应用程序描述语言来解析 fedora附带的wadl文件,因此它为 完整的rest api。 在此基础上,编写了一个更高级的抽象,它将 在本文中演示了doctest。 此软件包是为FedoraCommons 3.3和3.4编写的,但尚未 用旧版本测试。rest api文档可以在 Fedora维基

这个包可以使用buildout安装,它还将获取 Fedora安装程序,并在本地安装以进行测试。 使用以下步骤安装并运行此doctest:

python2.6 bootstrap.py
./bin/buildout
./bin/install_fedora
./bin/start_fedora
./bin/test

使用fcrepo包

连接到存储库

要连接正在运行的Fedora,我们首先需要连接。连接 代码大部分是从 Etienne Posthumus("epoz")duraspace模块复制的

< Buff行情>
>>> from fcrepo.connection import Connection
>>> connection = Connection('http://localhost:8080/fedora',
...                         username='fedoraAdmin',
...                         password='fedoraAdmin')

现在我们有了一个连接,我们可以创建一个fedoraclient:

< Buff行情>
>>> from fcrepo.client import FedoraClient
>>> client = FedoraClient(connection)

PIDS

Fedora对象需要一个唯一的PID才能运行。PID包括 命名空间字符串,然后是分号,然后是字符串标识符。 您可以使用随机uuid创建自己的pids,但也可以使用 Fedora的nextpid功能,返回升序数字。

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> ns, num = pid.split(':')
>>> ns == 'foo' and num.isdigit()
True

我们还可以同时获得多个PID

< Buff行情>
>>> pids = client.getNextPID(u'foo', numPIDs=10)
>>> len(pids)
10

此方法返回Unicode字符串或Unicode字符串列表,如果 请求多个PID。

客户机抽象为"低级"提供包装器 从wadl文件生成的api代码。 下面是通过wadl api进行的相同调用:

< Buff行情>
>>> print client.api.getNextPID().submit(namespace=u'foo', format=u'text/xml').read()
<?xml  ...?>
<pidList ...>
  <pid>...</pid>
</pidList>

所以客户机方法调用wadl api中的方法, 分析得到的XML并使用合理的默认参数。

这就是大多数客户机方法调用的工作方式。 通常您不需要直接访问wadl api, 我们继续吧。

创建对象

现在我们可以获取PIDS,我们可以使用它们并创建一个新对象:

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> obj = client.createObject(pid, label=u'My First Test Object')

不能用相同的PID创建两次对象。

< Buff行情>
>>> obj = client.createObject(pid, label=u'Second try?')
Traceback (most recent call last):
...
FedoraConnectionException: ... The PID 'foo:...' already exists in the registry; the object can't be re-created.

获取对象

当然,也可以使用客户机检索现有对象:

< Buff行情>
>>> obj = client.getObject(pid)
>>> print obj.label
My First Test Object

如果对象不存在,您将得到一个错误:

< Buff行情>
python2.6 bootstrap.py
./bin/buildout
./bin/install_fedora
./bin/start_fedora
./bin/test
0

删除对象

删除对象可以通过调用对象上的delete方法, 或者将PID传递给客户端上的deleteObject方法。

< Buff行情>
python2.6 bootstrap.py
./bin/buildout
./bin/install_fedora
./bin/start_fedora
./bin/test
1

请注意,在大多数情况下,您不想删除对象。最好是 将对象的状态设置为"已删除"。下一节将详细介绍这一点。

对象属性

在前面的例子中,我们检索了一个fedora对象。 这些对象具有许多可以获取和设置的属性:

< Buff行情>
python2.6 bootstrap.py
./bin/buildout
./bin/install_fedora
./bin/start_fedora
./bin/test
2

最后一行修改了Fedora服务器上的Label属性, 上次修改的日期现在应该已经更新:

< Buff行情>
python2.6 bootstrap.py
./bin/buildout
./bin/install_fedora
./bin/start_fedora
./bin/test
3

设置属性还可以用于更改FedoraObject的状态 使不活动或被删除。可以使用以下字符串:

< Buff行情>
  • a 表示激活
  • i 表示不活动
  • d 表示已删除
python2.6 bootstrap.py
./bin/buildout
./bin/install_fedora
./bin/start_fedora
./bin/test
4

让我们尝试一种不受支持的状态:

< Buff行情>
python2.6 bootstrap.py
./bin/buildout
./bin/install_fedora
./bin/start_fedora
./bin/test
5

设置修改或创建日期直接导致错误,无法设置。

< Buff行情>
python2.6 bootstrap.py
./bin/buildout
./bin/install_fedora
./bin/start_fedora
./bin/test
6

也可以使用以下属性配置ownerID:

< Buff行情>
python2.6 bootstrap.py
./bin/buildout
./bin/install_fedora
./bin/start_fedora
./bin/test
7

对象数据流

Fedora对象基本上是一个数据流容器。你可以迭代 查找数据流标识或调用数据流方法的对象:

< Buff行情>
python2.6 bootstrap.py
./bin/buildout
./bin/install_fedora
./bin/start_fedora
./bin/test
8

要实际获取数据流,我们可以像访问字典一样访问它:

< Buff行情>
python2.6 bootstrap.py
./bin/buildout
./bin/install_fedora
./bin/start_fedora
./bin/test
9

数据流属性

数据流有许多属性,包括label、state和createdDate,只是 像Fedora对象一样:

< Buff行情>
>>> from fcrepo.connection import Connection
>>> connection = Connection('http://localhost:8080/fedora',
...                         username='fedoraAdmin',
...                         password='fedoraAdmin')
0
>>> from fcrepo.connection import Connection
>>> connection = Connection('http://localhost:8080/fedora',
...                         username='fedoraAdmin',
...                         password='fedoraAdmin')
1

有不同类型的数据流,这个数据流的类型是 x ,这意味着 内容内联存储在foxml文件中。foxml是内部的 Fedora的存储格式。

< Buff行情>
>>> from fcrepo.connection import Connection
>>> connection = Connection('http://localhost:8080/fedora',
...                         username='fedoraAdmin',
...                         password='fedoraAdmin')
2

数据流可以是可版本的,可以打开或关闭。

< Buff行情>
>>> from fcrepo.connection import Connection
>>> connection = Connection('http://localhost:8080/fedora',
...                         username='fedoraAdmin',
...                         password='fedoraAdmin')
3

数据流还有一个位置,它由对象pid组成, 数据流ID和版本号

< Buff行情>
>>> from fcrepo.connection import Connection
>>> connection = Connection('http://localhost:8080/fedora',
...                         username='fedoraAdmin',
...                         password='fedoraAdmin')
4

让我们更改标签,看看会发生什么:

< Buff行情>
>>> from fcrepo.connection import Connection
>>> connection = Connection('http://localhost:8080/fedora',
...                         username='fedoraAdmin',
...                         password='fedoraAdmin')
5
>>> from fcrepo.connection import Connection
>>> connection = Connection('http://localhost:8080/fedora',
...                         username='fedoraAdmin',
...                         password='fedoraAdmin')
6

位置id随数据流的每个版本和旧版本的变化而变化 仍然可用。fcrepo客户端代码不包含要检索的方法 旧版本的数据流或查看对象的审核跟踪。 实现这一点的方法在wadl api中是可用的。

Fedora可以创建数据流中存储内容的校验和, 默认情况下,如果设置checksumtype属性,则禁用校验和 对于MD5,Fedora将为我们生成校验和。

< Buff行情>
>>> from fcrepo.connection import Connection
>>> connection = Connection('http://localhost:8080/fedora',
...                         username='fedoraAdmin',
...                         password='fedoraAdmin')
7

还有一些附加属性,不是所有属性都可以设置。 有关完整列表,请参阅rest api文档。 < Buff行情>

>>> from fcrepo.connection import Connection
>>> connection = Connection('http://localhost:8080/fedora',
...                         username='fedoraAdmin',
...                         password='fedoraAdmin')
8

获取和设置内容-1

我们还可以获取和设置数据流的内容:

< Buff行情>
>>> from fcrepo.connection import Connection
>>> connection = Connection('http://localhost:8080/fedora',
...                         username='fedoraAdmin',
...                         password='fedoraAdmin')
9
>>> from fcrepo.client import FedoraClient
>>> client = FedoraClient(connection)
0

获取和设置内容-2

我们也可以直接获取和设置内容, 好像它是一本词典

< Buff行情>
>>> from fcrepo.client import FedoraClient
>>> client = FedoraClient(connection)
1

特殊数据流:dc

这个总是可用的数据流实际上是一种特殊的 数据流。都柏林核心酒店这个xml流中的es存储在 可搜索的关系数据库。这些值也用于 OAIPMH饲料。Fedora使用遗留的 /elements/1.1/ 命名空间,其中包含 以下术语:

< Buff行情>
  • 撰稿人
  • 覆盖范围
  • 创建者
  • 日期
  • 说明
  • 格式
  • 标识符
  • 语言
  • 出版商
  • 关系
  • 权利
  • 来源
  • 主题
  • 标题
  • 键入

查看都柏林核心网站,了解这些属性的说明。

由于手工编辑dublin core xml数据有点麻烦, dc数据流允许访问dc属性,就像数据流 是字典:

< Buff行情>
>>> from fcrepo.client import FedoraClient
>>> client = FedoraClient(connection)
2

这也可用于设置值:

< Buff行情>
>>> from fcrepo.client import FedoraClient
>>> client = FedoraClient(connection)
3
>>> from fcrepo.client import FedoraClient
>>> client = FedoraClient(connection)
4

为了保存这个,我们再次调用setcontent方法,但是这次没有 论据。这将使代码使用字典中的值 为您生成XML字符串

< Buff行情>
>>> from fcrepo.client import FedoraClient
>>> client = FedoraClient(connection)
5

内联XML数据流

让我们尝试添加一些数据流,例如,我们希望存储一些xml数据:

< Buff行情>
>>> from fcrepo.client import FedoraClient
>>> client = FedoraClient(connection)
6

托管内容数据流

我们还可以添加托管内容,这将由Fedora存储和管理, 但它不是内联XML。数据存储在 硬盘驱动器。我们通过将controlgroup param设置为 m

< Buff行情>
>>> from fcrepo.client import FedoraClient
>>> client = FedoraClient(connection)
7

这对于小文件来说是很好的,但是当你不想保存的时候 整个文件在内存中也可以提供一个文件流。让我们做一个3MB 文件:

< Buff行情>
>>> from fcrepo.client import FedoraClient
>>> client = FedoraClient(connection)
8

现在我们将打开文件并将其流到Fedora。然后我们读了整件事 在内存中查看大小是否相同:

< Buff行情>
>>> from fcrepo.client import FedoraClient
>>> client = FedoraClient(connection)
9

外部引用的数据流

对于大型文件,将它们存储在Fedora中可能不方便。 在这种情况下,文件可以在外部托管,我们存储一个数据流 控制组类型 e (外部参考)

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> ns, num = pid.split(':')
>>> ns == 'foo' and num.isdigit()
True
0

此数据流没有任何内容,因此尝试读取 内容将导致错误

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> ns, num = pid.split(':')
>>> ns == 'foo' and num.isdigit()
True
1

我们可以通过:

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> ns, num = pid.split(':')
>>> ns == 'foo' and num.isdigit()
True
2

最后一个数据流类型是外部引用的流 重定向。此数据流具有controlgroup r (引用重定向)

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> ns, num = pid.split(':')
>>> ns == 'foo' and num.isdigit()
True
3

此数据流的工作方式与外部引用流相同。

删除数据流

通过对对象使用python del关键字可以删除数据流, 或者在数据流上调用delete方法。

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> ns, num = pid.split(':')
>>> ns == 'foo' and num.isdigit()
True
4

另一个特殊的数据流:rels-ext

除了特殊的数据流之外,还有另一种特殊的数据流 调用了rels-ext。 此数据流应包含将在 三重宝石。 rels-ext 数据流有一些额外的方法来帮助 使用RDF数据。

要创建rels-ext流,我们不需要提供rdfxml文件,它将 如果没有发送数据,请创建一个空的。

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> ns, num = pid.split(':')
>>> ns == 'foo' and num.isdigit()
True
5

现在我们可以添加一些rdf数据。每个谓词都包含一个值列表,每个值 value是一个带有value和type键的字典,还可以选择lang和 数据类型密钥。这与 rdf+json格式

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> ns, num = pid.split(':')
>>> ns == 'foo' and num.isdigit()
True
6

为了保存这个,我们调用setcontent方法而不需要任何数据。 这将把rdf语句序列化为rdfxml并执行save操作:

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> ns, num = pid.split(':')
>>> ns == 'foo' and num.isdigit()
True
7

我们不允许使用 dc 命名空间添加语句。 这将导致错误。我想这是因为 通过 dc 数据流。

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> ns, num = pid.split(':')
>>> ns == 'foo' and num.isdigit()
True
8

我们还可以使用rdf来创建对象之间的关系。例如,我们可以添加 一个使用fedora ismemberofcollection的关系,它可以用于分组 对象放入在OAIPMH源中使用的集合。

< Buff行情>
>>> pid = client.getNextPID(u'foo')
>>> ns, num = pid.split(':')
>>> ns == 'foo' and num.isdigit()
True
9
>>> pids = client.getNextPID(u'foo', numPIDs=10)
>>> len(pids)
10
0

注意,fedora pid需要先转换为uri,然后才能 在rdf中引用,这是通过将 info:fedora/ 前置到pid来完成的。

服务定义和对象方法

除了datastreams之外,fedora对象还可以通过 服务定义。我们不提供对服务定义的直接访问 但假设所有方法都有唯一的名称。

< Buff行情>
>>> pids = client.getNextPID(u'foo', numPIDs=10)
>>> len(pids)
10
1
>>> pids = client.getNextPID(u'foo', numPIDs=10)
>>> len(pids)
10
2

搜索对象

Fedora有两个搜索功能:字段查询搜索和简单查询搜索。 它们都从 dc 数据流和fedora对象属性中搜索数据。

字段搜索查询可以搜索以下字段:

< Buff行情>
  • 日期
  • 撰稿人
  • 覆盖范围
  • 创建者
  • 日期
  • dcmdate
  • 说明
  • 格式
  • 标识符
  • 标签
  • 语言
  • mdate
  • 所有者ID
  • PID
  • 出版商
  • 来源
  • 状态
  • 主题
  • 标题
  • 键入
  • 权利

Fedora有一个查询语法,您可以在其中输入一个或多个条件,用空格分隔。将返回符合所有条件的对象。

条件是一个字段(从上面的字段名中选择),后跟一个运算符和一个值。

如果字段的整个值与给定值匹配,=运算符将匹配。 ~运算符将匹配字段中的短语,并接受?和*通配符。 <;、>;、<;=和>;=运算符可用于日期等数值。

示例:

< Buff行情> < DL>
pid~演示:*说明~fedora
将所有演示对象与包含fedora一词的描述匹配。
cdate>;=1976-03-04创建者~*n*
匹配1976年3月4日或之后创建的对象,其中至少有一个创建者的名称中有n。
日期>;2002-10-2日期<;2002-10-2t12:00:00
匹配2002年10月2日中午(UTC)之前修改的对象

因此,让我们创建5个对象,用于搜索:

< Buff行情>
>>> pids = client.getNextPID(u'foo', numPIDs=10)
>>> len(pids)
10
3

现在我们将使用pid搜索来搜索这些对象,我们还需要标签 从搜索返回。

< Buff行情>
>>> pids = client.getNextPID(u'foo', numPIDs=10)
>>> len(pids)
10
4

搜索返回一个生成器,默认情况下,它向服务器查询 前10个对象,但是如果遍历resultset并结束 下一批将自动添加。

为了说明这一点,我们将使用2:

< Buff行情>
>>> pids = client.getNextPID(u'foo', numPIDs=10)
>>> len(pids)
10
5

如图所示,我们实际上得到的结果比最大值2要多,但是客户机要求 当我们遍历结果时,将结果分成两批使用Fedora 发电机。

当我们要在所有字段中搜索时,只需删除条件"pid:", 并指定"terms=true"。搜索不区分大小写,使用*还是?作为通配符。

< Buff行情>
>>> pids = client.getNextPID(u'foo', numPIDs=10)
>>> len(pids)
10
6

RDF索引搜索

除了在关系数据库中搜索dc数据流之外, 也可以通过triplestore查询rels-ext数据流 使用SPARQL语言。

让我们在 rels-ext数据流示例

< Buff行情>
>>> pids = client.getNextPID(u'foo', numPIDs=10)
>>> len(pids)
10
7

其他输出格式和查询语言可以通过 仅支持默认SPARQL。

searchTriples方法还有一个 flush 参数。 如果在fedora中更改rels-ext数据流,那么triplestore实际上不是 更新!当搜索到 true 时,必须将此flush参数设置为 确保更新了TripleStore。默认情况下,Fedora设置刷新 参数设置为 false 这对于性能来说是可以理解的,但是 可能会很混乱。 默认情况下,此库将参数设置为 true 效率高,但您确信TripleStore是最新的。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用CSPRNG中的序列种子PRNG安全吗?   java如何使JTable列大小与内容精确(或紧密)匹配?   java Android textview具有两种不同大小的文本   java在任意事物的列表(数组)中创建关联的最佳方法是什么?   java保存可扩展字符串?   java成员类(内部类)如何访问外部类的实例变量?   java使用Android 6.0(API级别23)使用rest的最佳方式是什么   java为什么我会收到“学习记录”。Student@25a43blb'尝试显示链接列表中的所有对象时?   java如何将SVG文本转换为SVG路径?   java Paypal返回URL参数支付状态   java Libgdx:导出到可运行Jar   java JPA获取连接实体的最小/最大属性   附加到类型变量的java编号?   java Object[]到底是什么?   java如何在安卓中的片段和活动之间共享数据   java使用MinGW为windows构建linux库   java将变量值传递给eval函数   java仅在转换完成时使方法返回   Java二维数组对角线