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/test0
删除对象
删除对象可以通过调用对象上的delete方法, 或者将PID传递给客户端上的deleteObject方法。
< Buff行情>python2.6 bootstrap.py ./bin/buildout ./bin/install_fedora ./bin/start_fedora ./bin/test1
请注意,在大多数情况下,您不想删除对象。最好是 将对象的状态设置为"已删除"。下一节将详细介绍这一点。
对象属性
在前面的例子中,我们检索了一个fedora对象。 这些对象具有许多可以获取和设置的属性:
< Buff行情>python2.6 bootstrap.py ./bin/buildout ./bin/install_fedora ./bin/start_fedora ./bin/test2
最后一行修改了Fedora服务器上的Label属性, 上次修改的日期现在应该已经更新:
< Buff行情>python2.6 bootstrap.py ./bin/buildout ./bin/install_fedora ./bin/start_fedora ./bin/test3
设置属性还可以用于更改FedoraObject的状态 使不活动或被删除。可以使用以下字符串:
< Buff行情>a
表示激活i
表示不活动d
表示已删除
python2.6 bootstrap.py ./bin/buildout ./bin/install_fedora ./bin/start_fedora ./bin/test4
让我们尝试一种不受支持的状态:
< Buff行情>python2.6 bootstrap.py ./bin/buildout ./bin/install_fedora ./bin/start_fedora ./bin/test5
设置修改或创建日期直接导致错误,无法设置。
< Buff行情>python2.6 bootstrap.py ./bin/buildout ./bin/install_fedora ./bin/start_fedora ./bin/test6
也可以使用以下属性配置ownerID:
< Buff行情>python2.6 bootstrap.py ./bin/buildout ./bin/install_fedora ./bin/start_fedora ./bin/test7
对象数据流
Fedora对象基本上是一个数据流容器。你可以迭代 查找数据流标识或调用数据流方法的对象:
< Buff行情>python2.6 bootstrap.py ./bin/buildout ./bin/install_fedora ./bin/start_fedora ./bin/test8
要实际获取数据流,我们可以像访问字典一样访问它:
< Buff行情>python2.6 bootstrap.py ./bin/buildout ./bin/install_fedora ./bin/start_fedora ./bin/test9
数据流属性
数据流有许多属性,包括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的存储格式。
>>> 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/
命名空间,其中包含
以下术语:
- 撰稿人
- 覆盖范围
- 创建者
- 日期
- 说明
- 格式
- 标识符
- 语言
- 出版商
- 关系
- 权利
- 来源
- 主题
- 标题
- 键入
查看都柏林核心网站,了解这些属性的说明。
由于手工编辑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
>>> 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
(外部参考)
>>> pid = client.getNextPID(u'foo') >>> ns, num = pid.split(':') >>> ns == 'foo' and num.isdigit() True0
此数据流没有任何内容,因此尝试读取 内容将导致错误
< Buff行情>>>> pid = client.getNextPID(u'foo') >>> ns, num = pid.split(':') >>> ns == 'foo' and num.isdigit() True1
我们可以通过:
< Buff行情>>>> pid = client.getNextPID(u'foo') >>> ns, num = pid.split(':') >>> ns == 'foo' and num.isdigit() True2
最后一个数据流类型是外部引用的流
重定向。此数据流具有controlgroup
r
(引用重定向)
>>> pid = client.getNextPID(u'foo') >>> ns, num = pid.split(':') >>> ns == 'foo' and num.isdigit() True3
此数据流的工作方式与外部引用流相同。
删除数据流
通过对对象使用python del关键字可以删除数据流, 或者在数据流上调用delete方法。
< Buff行情>>>> pid = client.getNextPID(u'foo') >>> ns, num = pid.split(':') >>> ns == 'foo' and num.isdigit() True4
另一个特殊的数据流: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() True5
现在我们可以添加一些rdf数据。每个谓词都包含一个值列表,每个值 value是一个带有value和type键的字典,还可以选择lang和 数据类型密钥。这与 rdf+json格式
< Buff行情>>>> pid = client.getNextPID(u'foo') >>> ns, num = pid.split(':') >>> ns == 'foo' and num.isdigit() True6
为了保存这个,我们调用setcontent方法而不需要任何数据。 这将把rdf语句序列化为rdfxml并执行save操作:
< Buff行情>>>> pid = client.getNextPID(u'foo') >>> ns, num = pid.split(':') >>> ns == 'foo' and num.isdigit() True7
我们不允许使用
dc
命名空间添加语句。
这将导致错误。我想这是因为
通过
dc
数据流。
>>> pid = client.getNextPID(u'foo') >>> ns, num = pid.split(':') >>> ns == 'foo' and num.isdigit() True8
我们还可以使用rdf来创建对象之间的关系。例如,我们可以添加 一个使用fedora ismemberofcollection的关系,它可以用于分组 对象放入在OAIPMH源中使用的集合。
< Buff行情>>>> pid = client.getNextPID(u'foo') >>> ns, num = pid.split(':') >>> ns == 'foo' and num.isdigit() True9
>>> pids = client.getNextPID(u'foo', numPIDs=10) >>> len(pids) 100
注意,fedora pid需要先转换为uri,然后才能
在rdf中引用,这是通过将
info:fedora/
前置到pid来完成的。
服务定义和对象方法
除了datastreams之外,fedora对象还可以通过 服务定义。我们不提供对服务定义的直接访问 但假设所有方法都有唯一的名称。
< Buff行情>>>> pids = client.getNextPID(u'foo', numPIDs=10) >>> len(pids) 101
>>> pids = client.getNextPID(u'foo', numPIDs=10) >>> len(pids) 102
搜索对象
Fedora有两个搜索功能:字段查询搜索和简单查询搜索。
它们都从
dc
数据流和fedora对象属性中搜索数据。
字段搜索查询可以搜索以下字段:
< Buff行情>- 日期
- 撰稿人
- 覆盖范围
- 创建者
- 日期
- dcmdate
- 说明
- 格式
- 标识符
- 标签
- 语言
- mdate
- 所有者ID
- PID
- 出版商
- 来源
- 状态
- 主题
- 标题
- 键入
- 权利
Fedora有一个查询语法,您可以在其中输入一个或多个条件,用空格分隔。将返回符合所有条件的对象。
条件是一个字段(从上面的字段名中选择),后跟一个运算符和一个值。
如果字段的整个值与给定值匹配,=运算符将匹配。 ~运算符将匹配字段中的短语,并接受?和*通配符。 <;、>;、<;=和>;=运算符可用于日期等数值。
示例:
< Buff行情> < DL>因此,让我们创建5个对象,用于搜索:
< Buff行情>>>> pids = client.getNextPID(u'foo', numPIDs=10) >>> len(pids) 103
现在我们将使用pid搜索来搜索这些对象,我们还需要标签 从搜索返回。
< Buff行情>>>> pids = client.getNextPID(u'foo', numPIDs=10) >>> len(pids) 104
搜索返回一个生成器,默认情况下,它向服务器查询 前10个对象,但是如果遍历resultset并结束 下一批将自动添加。
为了说明这一点,我们将使用2:
< Buff行情>>>> pids = client.getNextPID(u'foo', numPIDs=10) >>> len(pids) 105
如图所示,我们实际上得到的结果比最大值2要多,但是客户机要求 当我们遍历结果时,将结果分成两批使用Fedora 发电机。
当我们要在所有字段中搜索时,只需删除条件"pid:", 并指定"terms=true"。搜索不区分大小写,使用*还是?作为通配符。
< Buff行情>>>> pids = client.getNextPID(u'foo', numPIDs=10) >>> len(pids) 106
RDF索引搜索
除了在关系数据库中搜索dc数据流之外, 也可以通过triplestore查询rels-ext数据流 使用SPARQL语言。
让我们在 rels-ext数据流示例
< Buff行情>>>> pids = client.getNextPID(u'foo', numPIDs=10) >>> len(pids) 107
其他输出格式和查询语言可以通过 仅支持默认SPARQL。
searchTriples方法还有一个
flush
参数。
如果在fedora中更改rels-ext数据流,那么triplestore实际上不是
更新!当搜索到
true
时,必须将此flush参数设置为
确保更新了TripleStore。默认情况下,Fedora设置刷新
参数设置为
false
这对于性能来说是可以理解的,但是
可能会很混乱。
默认情况下,此库将参数设置为
true
效率高,但您确信TripleStore是最新的。