Excerpt |
---|
This page provides detailed steps for creating repository content via the REST API, and SPARQL queries to demonstrate that content in the triplestorehas been synchronized to an external triplestore. For more details on setting up triplestore sync, see External Triplestore. Much more information about the REST API is available at: RESTful HTTP API and Another Take on the REST API . |
1. Finding
...
Containers by
...
Binary Name or MIME Type
Create a few sample objects containers with either a PDF or a text file, or both attached as datastreams binaries (these the following commands assume you have two files named test.pdf and test.txt in your current working directory, ; please substitute working filenames as needed):
Code Block |
---|
title | File: objectcontainer-indexing.rdf |
---|
|
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX indexing: <http://fedora.info/definitions/v4/indexing#>
DELETE { }
INSERT {
<> indexing:hasIndexingTransformation "default";
rdf:type indexing:indexable }
WHERE { } |
Code Block |
---|
language | bash |
---|
title | 1a. Creating Sample ObjectsContainers |
---|
|
curl -X POSTPUT -H "Content-type: application/sparql-"http://localhost:8080/rest/objects/101"
curl -X PATCH -H "Content-type: application/sparql-update" --data-binary "@object-indexing.rdf" "http://localhost:8080/rest/objects/101"
curl -X POSTPUT -H "Content-type: application/pdf" --data-binary "@test.pdf" "http://localhost:8080/rest/objects/101/master/fcr:content"
curl -X POSTPATCH -H "Content-type: application/sparql-update" --data-binary "@object-indexing.rdf" "http://localhost:8080/rest/objects/102101/master/fcr:metadata"
curl -X POSTPUT -H "Content-type: text/plain" --data-binary "@test.txt" "http://"http://localhost:8080/rest/objects/102/master/fcr:content"
curl -X POSTPATCH -H "Content-type: application/sparql-update" --data-binary "@object-indexing.rdf" "http://localhost:8080/rest/objects/103102"
curl -X POSTPUT -H "Content-type: applicationtext/pdfplain" --data-binary "@test.pdftxt" "http://localhost:8080/rest/objects/103102/master/fcr:content"
curl -X POSTPATCH -H "Content-type: textapplication/plainsparql-update" --data-binary "@test@object-indexing.txtrdf" "http://localhost:8080/rest/objects/103102/textmaster/fcr:content" |
Find objects with a datastream named "text":
Code Block |
---|
language | sql |
---|
title | 1b. Selecting Objects With Datastreams Named "text" |
---|
|
prefix fcrepo: <http://fedora.info/definitions/v4/repository#>
select ?object where { ?ds fcrepo:mixinTypes "fedora:datastream" .
?ds fcrepo:hasParent ?object . filter(str(?ds)=concat(str(?object),'/text')) } |
Expected Results
object |
---|
<http://localhost:8080/rest/objects/103> |
Find objects with a PDF datastream:
Code Block |
---|
language | sql |
---|
title | 1c. Selecting Objects With PDF Datastreams |
---|
|
prefix fcrepo: <http://fedora.info/definitions/v4/repository#>
select ?object where { ?ds fcrepo:mixinTypes "fedora:datastream" .
?ds fcrepo:hasParent ?object . ?ds fcrepo:hasContent ?content .
?content fcrepo:mimeType "application/pdf" } |
Expected Results
object |
---|
<http://localhost:8080/rest/objects/101> |
<http://localhost:8080/rest/objects/103> |
2. Attach metadata properties directly to objects
Create an object and attach the dc:title property:
Code Block |
---|
language | bash |
---|
title | 2a. Creating Sample Objects |
---|
|
curl -X POST metadata"
curl -X PUT "http://localhost:8080/rest/objects/103"
curl -X PATCH -H "Content-type: application/sparql-update" --data-binary "@object-indexing.rdf" "http://localhost:8080/rest/objects/103"
curl -X PUT -H "Content-type: application/pdf" --data-binary "@test.pdf" "http://localhost:8080/rest/objects/103/master"
curl -X PUT -H "Content-type: text/plain" --data-binary "@test.txt" "http://localhost:8080/rest/objects/103/text"
curl -X PATCH -H "Content-type: application/sparql-update" --data-binary "@object-indexing.rdf" "http://localhost:8080/rest/objects/103/master/fcr:metadata"
curl -X PATCH -H "Content-type: application/sparql-update" --data-binary "@object-indexing.rdf" "http://localhost:8080/rest/objects/201
echo "prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-/103/text/fcr:metadata" |
Find containers with a binary named "text":
Code Block |
---|
language | sql |
---|
title | 1b. Selecting Containers With Binaries Named "text" |
---|
|
prefix fcrepons> prefix index: <http://fedora.info/definitions/v4/indexing#> insert data { <> rdf:type index:indexable . }" \
| curl -X PATCH --upload-file - http://repository#>
select ?object where {
?ds fcrepo:mixinTypes "fedora:NonRdfSourceDescription" .
?ds fcrepo:hasParent ?object .
filter(str(?ds)=concat(str(?object),'/text/fcr:metadata'))
} |
Expected Results
container |
---|
<http://localhost:8080/rest/objects/ |
...
Find containers with a PDF binary:
Code Block |
---|
language | sql |
---|
title | 1c. Selecting Containers With PDF Binaries |
---|
|
prefix fcrepo: <http://fedora.info/definitions/v4/repository#>
prefix relation: <http://www.iana.org/assignments/relation/>
select ?object where {
?ds fcrepo:mixinTypes "fedora:NonRdfSourceDescription" .
?ds fcrepo:hasParent ?object .
?ds relation:describes ?content .
?content fcrepo:mimeType "application/pdf"
} |
Expected Results
container |
---|
<http://localhost:8080/rest/objects/ |
...
101> |
<http://localhost:8080/rest/objects/103> |
2. Attach metadata properties directly to containers
Create an container and attach the dc:title property:
Find objects with titles:
Code Block |
---|
language | sqlbash |
---|
title | 2b. Selecting Objects With Titles |
---|
|
prefix dc: <http://purl.org/dc/elements/1.1/>
select ?object ?title where { ?object dc:title ?title } |
Expected Results
object | title |
---|
<http://localhost:8080/rest/objects/201> | "Foo" |
3. Find Objects By Collection Membership
Create three objects and three collections:
2a. Creating Sample Containers |
|
curl -X PUT http://localhost:8080/rest/objects/201
echo "prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix index: <http://fedora.info/definitions/v4/indexing#> insert data { <> rdf:type index:indexable . }" \
| curl -X PATCH --upload-file - |
Code Block |
---|
language | bash |
---|
title | 3a. Creating Sample Objects And Collections |
---|
|
curl -X POST http://localhost:8080/rest/objects/col1
curl -X POST http://localhost:8080/rest/objects/col2201
curlecho -X POST http"prefix dc: <http://localhost:8080/rest/objects/col3
curl -X POST httppurl.org/dc/elements/1.1/> insert data { <http://localhost:8080/rest/objects/obj1
201> dc:title 'Foo' . }" \
| curl -X POSTPATCH --upload-file - http://localhost:8080/rest/objects/obj2
curl -X POST http://localhost:8080/rest/objects/obj3201 |
Find containers with titlesMark the objects indexable:
Code Block |
---|
language | bashsql |
---|
title | 3b. Marking objects indexable | 2b. Selecting Containers With Titles |
---|
|
prefix dcecho "prefix rdf: <http://wwwpurl.w3.org/dc/1999elements/02/22-rdf-syntax-ns> prefix index: <http://fedora.info/definitions/v4/indexing#> insert data { <> rdf:type index:indexable . }" \
| curl -X PATCH --upload-file - 1.1/>
select ?object ?title where { ?object dc:title ?title } |
Expected Results
container | title |
---|
<http://localhost:8080/rest/objects/201> | "Foo" |
3. Find Containers By Collection Membership
Create three containers and three collections:
Code Block |
---|
language | bash |
---|
title | 3a. Creating Sample Containers And Collections |
---|
|
curl -X PUT http://localhost:8080/rest/objects/col1
curl -X PUT http://localhost:8080/rest/objects/col2
curl -X PUT obj1
echo "prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns> prefix index: <http://fedora.info/definitions/v4/indexing#> insert data { <> rdf:type index:indexable . }" \
| curl -X PATCH --upload-file - http://localhost:8080/rest/objects/obj2col3
echocurl "prefix rdf: <http-X PUT http://www.w3.org/1999/02/22-rdf-syntax-ns> prefix index: <http://fedora.info/definitions/v4/indexing#> insert data { <> rdf:type index:indexable . }" \
| localhost:8080/rest/objects/obj1
curl -X PUT http://localhost:8080/rest/objects/obj2
curl -X PATCH --upload-file - httpPUT http://localhost:8080/rest/objects/obj3 |
Link each object to a collectionMark the containers indexable:
Code Block |
---|
language | bash |
---|
title | 3c. Linking Objects To Collections3b. Marking containers indexable |
---|
|
echo '"insert data { <> <http://localhost:8080/rest/objects/obj1>www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://fedora.info/definitions/v4/rels-ext#isMemberOfCollection> <http://localhost:8080/rest/objects/col1> . }' indexing#indexable> . }" \
| curl -X PATCH --upload-file - http://localhost:8080/rest/objects/obj1
echo '"insert data { <> <http://localhost:8080/rest/objects/obj2>www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://fedora.info/definitions/v4/rels-ext#isMemberOfCollection> <http://localhost:8080/rest/objects/col2> . }' | curl -X PATCH --indexing#indexable> . }" \
| curl -X PATCH --upload-file - http://localhost:8080/rest/objects/obj2
echo '"insert data { <> <http://localhost:8080/rest/objects/obj3>www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://fedora.info/definitions/v4/rels-ext#isMemberOfCollection> <http://localhost:8080/rest/objects/col3> . }' indexing#indexable> . }" \
| curl -X PATCH --upload-file - http://localhost:8080/rest/objects/obj3
|
Link the collections in a hierarchy:
Code Block |
---|
language | bash |
---|
title | 3d. Linking Collections In A Hierarchy |
---|
|
echo '"insert data { <> <http://localhost:8080/rest/objects/col1>www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://fedora.info/definitions/v4/rels-ext#hasPart> <http://localhost:8080/rest/objects/col2>indexing#indexable> . }'" \
| curl -X PATCH --upload-file - http://localhost:8080/rest/objects/col1
echo '"insert data { <> <http://localhost:8080/rest/objects/col2>www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://fedora.info/definitions/v4/rels-ext#hasPart> <http://localhost:8080/rest/objects/col3> . }' indexing#indexable> . }" \
| curl -X PATCH --upload-file - http://localhost:8080/rest/objects/col2 |
Find objects directly attached to a collection:
Code Block |
---|
language | sql |
---|
title | 3e. Selecting Objects Directly Linked To A Collection |
---|
|
select ?obj ?col where { ?obj
echo "insert data { <> <http://fedorawww.w3.infoorg/definitions1999/v4/rels-ext#isMemberOfCollection> ?col } |
Expected Results
...
02/22-rdf-syntax-ns#type> <http:// |
...
fedora.info/definitions/v4/indexing#indexable> . }" \
| curl -X PATCH --upload-file - http://localhost:8080/rest/objects/ |
...
Link each container to a collection:
Code Block |
---|
language | bash |
---|
title | 3c. Linking Containers To Collections |
---|
|
echo 'insert data { <http://localhost:8080/rest/objects/ |
...
obj1> <http://some-vocabulary.org/rels-ext#isMemberOfCollection> <http://localhost:8080/rest/objects/ |
...
col1> . }' | curl -X PATCH --upload-file - http://localhost:8080/rest/objects/ |
...
obj1
echo 'insert data { <http://localhost:8080/rest/objects/ |
...
Find objects directly or indirectly attached (down to the third level):
Code Block |
---|
language | sql |
---|
title | 3f. Select Objects Directly Or Indirectly Linked To A Collection |
---|
|
prefix rels:obj2> <http://some-vocabulary.org/rels-ext#isMemberOfCollection> <http://fedora.info/definitions/v4/rels-ext#>
select ?obj where {
{ ?obj rels:isMemberOfCollectionlocalhost:8080/rest/objects/col2> . }' | curl -X PATCH --upload-file - http://localhost:8080/rest/objects/obj2
echo 'insert data { <http://localhost:8080/rest/objects/obj3> <http://some-vocabulary.org/rels-ext#isMemberOfCollection> <http://localhost:8080/rest/objects/col3> . }' | curl -X PATCH --upload-file - http://localhost:8080/rest/objects/obj3
|
Link the collections in a hierarchy:
Code Block |
---|
language | bash |
---|
title | 3d. Linking Collections In A Hierarchy |
---|
|
echo 'insert data { <http://localhost:8080/rest/objects/col1> <http://some-vocabulary.org/rels-ext#hasPart> <http://localhost:8080/rest/objects/col2> . }' | curl -X PATCH --upload-file - http://localhost:8080/rest/objects/col1
echo 'insert data { <http://localhost:8080/rest/objects/col2> <http://some-vocabulary.org/rels-ext#hasPart> <http://localhost:8080/rest/objects/col3> . }' | curl -X PATCH --upload-file - http://localhost:8080/rest/objects/col2 |
Find containers directly attached to a collection:
Code Block |
---|
language | sql |
---|
title | 3e. Selecting Containers Directly Linked To A Collection |
---|
|
select ?obj ?col where { ?obj <http://some-vocabulary.org/rels-ext#isMemberOfCollection> ?col } |
Expected Results
obj | col |
---|
<http://localhost:8080/rest/objects/obj1> | <http://localhost:8080/rest/objects/col1> |
<http://localhost:8080/rest/objects/obj2> | <http://localhost:8080/rest/objects/col2> |
<http://localhost:8080/rest/objects/obj3> | <http://localhost:8080/rest/objects/col3> |
Find containers directly or indirectly attached (recursive retrieval along the rels:hasPart chain). Applications developed using Fedora 3 may use Mulgara's walk() function for queries that navigate a hierarchy. That functionality is now part of standard SPARQL 1.1 (Jena's property paths documentation provides some good examples). Code Block |
---|
language | sql |
---|
title | 3f. Select Containers Directly Or Indirectly Linked To A Collection |
---|
|
prefix rels: <http://some-vocabulary.org/rels-ext#>
select ?obj where {
col1> }
UNION
{ ?obj rels:isMemberOfCollection ?c .
<http://localhost:8080/rest/objects/col1> rels:hasPart ?c }
UNION
{ ?obj rels:isMemberOfCollection ?c .
<http://localhost:8080/rest/objects/col1> rels:hasPart* ?c1col
. ?c1obj rels:hasPartisMemberOfCollection ?c }col
} |
Expected Results
objcontainers |
---|
<http://localhost:8080/rest/objects/obj1> |
<http://localhost:8080/rest/objects/obj2> |
<http://localhost:8080/rest/objects/obj3> |
Also link an object a container to a project:
Code Block |
---|
language | bash |
---|
title | 3g. Select Objects Directly Or Indirectly Linked Link Containers To A CollectionProject |
---|
|
curl -X POSTPUT http://localhost:8080/rest/objects/proj1
echo "prefix rdf:insert data { <> <http://www.w3.org/1999/02/22-rdf-syntax-ns> prefix index:ns#type> <http://fedora.info/definitions/v4/indexing#> insert data { <> rdf:type index:indexableindexing#indexable> . }" \
| curl -X PATCH --upload-file - http://localhost:8080/rest/objects/proj1
echo '"prefix ex: <http://example.org/> insert data { <http://localhost:8080/rest/objects/obj1> ex:project <http://localhost:8080/rest/objects/proj1> . }" \
| curl -X PATCH --upload-file - http://localhost:8080/rest/objects/obj1 |
Find objects containers in a collection or linked to a project:
Code Block |
---|
language | sql |
---|
title | 3h. Select Objects Containers Linked To A Collection or A Project |
---|
|
prefix rels: <http://fedora.info/definitions/v4/some-vocabulary.org/rels-ext#>
prefix ex: <http://example.org/>
select ?obj where {
{ ?obj ex:project <http://localhost:8080/rest/objects/proj1> }
UNION
{ ?obj rels:isMemberOfCollection <http://localhost:8080/rest/objects/col2> }
} |
Expected Results
obj |
---|
<http://localhost:8080/rest/objects/obj1> |
<http://localhost:8080/rest/objects/obj2> |
Count objects containers instead of listing them:
Code Block |
---|
language | sql |
---|
title | 3i. Count the Objects Containers Linked to a Collection or a Project |
---|
|
prefix rels: <http://fedora.info/definitions/v4some-vocabulary.org/rels-ext#>
prefix ex: <http://example.org/>
select (count(distinct ?obj) as ?count) where {
{ ?obj ex:project <http://localhost:8080/rest/objects/proj1> }
UNION
{ ?obj rels:isMemberOfCollection <http://localhost:8080/rest/objects/col2> }
} |
...