
Creating a candidate dataset in Excel
Source:vignettes/candidate_dataset_excel.Rmd
candidate_dataset_excel.RmdOverview
A Betwixt review begins with a candidate dataset: a table containing proposed descriptions, classifications, and relationships that a reviewer can examine and, where necessary, correct.
You do not need to construct this table programmatically. You can prepare it in Microsoft Excel, LibreOffice Calc, or another spreadsheet editor.
This vignette demonstrates how to:
- Create an empty Betwixt candidate template.
- Populate the template with museum records in Excel.
- Describe six distinct entities using three museum records.
- Propose classifications and relationships for review.
- Import and validate the completed spreadsheet.
- Render a standalone HTML review.
- Understand what happens to the candidate assertions after review.
The example is based on three garment records from MuIS, the Estonian museum information system. For each record, we propose two entities: a physical museum object and a photographic representation of that object.
The exercise deliberately introduces a small semantic modelling problem. It is not simply about correcting labels. The reviewer must consider what entities exist, what kinds of entities they are, and how they relate to one another.
Understand the example
We begin with three museum records.
| MuIS record | Object label |
|---|---|
| 635780 | sweater, women’s |
| 633053 | gloves |
| 635778 | shirt, women’s |
Each record has an associated photographic image.
A museum object and a photograph of that object are not the same entity. The object is a physical heritage item; the photograph is a visual representation of that item.
For the purposes of this exercise, we therefore propose six entities:
| Subject | Proposed classification | Description |
|---|---|---|
| item1 | object | sweater, women’s |
| item2 | object | gloves |
| item3 | object | shirt, women’s |
| item4 | photograph | Photograph of sweater, women’s |
| item5 | photograph | Photograph of gloves |
| item6 | photograph | Photograph of shirt, women’s |
These are candidate entities. Their classifications and relationships are proposed for review, rather than treated as established facts.
The photographs and objects deliberately share their MuIS evidence URLs. This does not mean that they have the same identity. You will create a table like https://usebetwixt.com/examples/tutorial/muis_dual_representation_example.html.

Relationships between the entities
In this example, you can create a dual review table that has representations and represented entities. We propose two reciprocal relationships.
- The property
depictsdescribes what a photograph represents. - The property
depicted_bydescribes which photograph represents an object.
For the first garment:
item1 -- depicted_by --> item4
item4 -- depicts -----> item1
The same pattern applies to the other two garments:
item2 -- depicted_by --> item5
item5 -- depicts -----> item2
item3 -- depicted_by --> item6
item6 -- depicts -----> item3
The reviewer will be able to examine both directions independently.
You could also create similar dual properties, like
derived_from and derivation, for example, if
you create a zoomed detail from a large photograph, or if you modify a
media image.
It is not necessary to register dual relationships.
In this tutorial, we just show that you can create such, richer
representation when you need to. We also introduce
heritage_of, a proposed cultural heritage association,
which is not a dual property. Its candidate values are initially empty
because the MuIS record identifiers and garment descriptions alone do
not establish cultural affiliation.
Create an empty spreadsheet template
First, load Betwixt.
The function create_candidate_template() creates an
empty table with the column names expected by Betwixt.
For this exercise, we need four reviewable properties:
-
instance_of: the type or classification of the entity. -
depicts: the entity represented by a photograph. -
depicted_by: the photograph representing an entity. -
heritage_of: the cultural heritage association.
We also include context_held_by, which provides
contextual information but is not itself a reviewable assertion.
template <- create_candidate_template(
input_label = FALSE,
columns = c(
"instance_of",
"depicts",
"depicted_by",
"heritage_of"
),
context = "context_held_by"
)
names(template)
#> [1] "row_id" "input_url" "input_media_url"
#> [4] "input_description" "label" "description"
#> [7] "subject" "subject_range" "subject_definition"
#> [10] "instance_of" "instance_of_range" "instance_of_definition"
#> [13] "depicts" "depicts_range" "depicts_definition"
#> [16] "depicted_by" "depicted_by_range" "depicted_by_definition"
#> [19] "heritage_of" "heritage_of_range" "heritage_of_definition"
#> [22] "context_held_by"The template contains column headers but no records.
Export it to Excel:
writexl::write_xlsx(
template,
"muis-dual-representation.xlsx"
)Open muis-dual-representation.xlsx in Excel.
Important: Keep the column names unchanged. Do not insert explanatory rows above the headers or merge cells.
Enter six candidate entities
Each row represents one entity proposed for registration in a database.
We need six rows because we are distinguishing three museum objects from three photographs.
The following blocks are designed for direct copying into Excel. Each block contains six lines, corresponding to rows 2–7 of the spreadsheet.
Paste the contents into the column named above each block, starting in the first data cell.
Row identifiers
The row_id column identifies rows in the candidate
dataset.
It is not a museum identifier and does not represent a semantic relationship.
Column: row_id
1
2
3
4
5
6
Each row identifier must be a unique positive integer.
Subject identifiers
The subject column identifies the entity about which
assertions are being proposed.
In this example, we use short local identifiers. You can use here
Wikidata QIDs, your local Wikibase QIDs, or any reference. If you use
Betwixt to populate a future database, the best if you create
placeholders like we do here with item1 to
item6
Column: subject
item1
item2
item3
item4
item5
item6
The subject identifier is different from the row identifier. The row identifier identifies a table row; the subject identifies an entity.
In a production knowledge system, the local subject identifiers could subsequently be associated with persistent identifiers or IRIs.
Descriptive labels
The label column contains the proposed human-readable
label for each entity.
Column: label
sweater, women's
gloves
shirt, women's
Photograph of sweater, women's
Photograph of gloves
Photograph of shirt, women's
The first three labels describe physical objects.
The final three labels describe their photographic representations.
These labels are candidate assertions. A reviewer may correct them.
Descriptions
The description column contains a proposed textual
description of each entity.
Column: description
Museum object documented in MuIS record 635780
Museum object documented in MuIS record 633053
Museum object documented in MuIS record 635778
Photographic representation associated with MuIS record 635780
Photographic representation associated with MuIS record 633053
Photographic representation associated with MuIS record 635778
The descriptions are intentionally simple. They identify the documentary basis of the proposed entities without making additional claims about their origin, creators, or cultural affiliations.
Alternative label and description
Betwixt allows you to provide alternative labels and descriptions for the same entity. This can be useful when preparing a database for different audiences, such as English and Hungarian speakers, museum curators, and exhibition visitors.
You can add either or both of the following columns to your Excel spreadsheet:
alternative_label— an alternative name or short label for the entity.alternative_description— an alternative textual description of the entity.
For example, a museum object labelled sweater, women’s might have the Hungarian alternative label női pulóver. Similarly, its English description could be accompanied by a Hungarian description intended for museum visitors.

To include these properties, simply add one or two columns with the
exact headers alternative_label and
alternative_description. Enter the alternative values in
the corresponding rows. You do not need to change any other columns.
Both columns are optional. You can use either one independently, use both, or leave individual cells empty when no alternative is available.
Like label and description, these columns
contain candidate assertions. They are included in the
Betwixt review so that reviewers can examine and correct the proposed
alternative wording. The original labels and descriptions remain
separate.
Add documentary evidence
A candidate assertion should be accompanied by evidence that the reviewer can inspect.
Betwixt distinguishes the source of an observation from the assertion proposed on the basis of that source.
In our example:
-
input_urllinks to the MuIS museum record. -
input_media_urlprovides a photograph for visual inspection. -
input_descriptionidentifies the source record.
The same evidence may support more than one candidate entity.
Source record URLs
Column: input_url
https://www.muis.ee/museaalview/635780
https://www.muis.ee/museaalview/633053
https://www.muis.ee/museaalview/635778
https://www.muis.ee/museaalview/635780
https://www.muis.ee/museaalview/633053
https://www.muis.ee/museaalview/635778
Notice that the first and fourth rows have the same source URL. We are talking about the same thing, but first about the photographed object, then about the photograph itself. You would do something similar with derived objects, for example.
These dual representes refer to different proposed entities (i.e. a textile garment and photograph), but both are supported by the same MuIS record.
Photographic evidence
Column: input_media_url
https://www.muis.ee/digitaalhoidla/api/meedia/pisipilt?id=ebc07930-f719-44f2-a108-6698bcecc20b
https://www.muis.ee/digitaalhoidla/api/meedia/pisipilt?id=6440f24f-eaad-4cd4-84d7-1ae7a9d44d5a
https://www.muis.ee/digitaalhoidla/api/meedia/pisipilt?id=826c402e-c130-4860-b11e-9538bd403ecf
https://www.muis.ee/digitaalhoidla/api/meedia/pisipilt?id=ebc07930-f719-44f2-a108-6698bcecc20b
https://www.muis.ee/digitaalhoidla/api/meedia/pisipilt?id=6440f24f-eaad-4cd4-84d7-1ae7a9d44d5a
https://www.muis.ee/digitaalhoidla/api/meedia/pisipilt?id=826c402e-c130-4860-b11e-9538bd403ecf
These URLs provide the images displayed in the HTML review. Betwixt
supports local review files, and you can also add here simply your local
files, like images/myimage1.jpg.
An image is evidence for the proposed assertions, not proof that those assertions are correct.
Source descriptions
Column: input_description
MuIS museum record 635780
MuIS museum record 633053
MuIS museum record 635778
MuIS museum record 635780
MuIS museum record 633053
MuIS museum record 635778
The input_description identifies the evidence. The
description column, entered earlier, describes the proposed
entity.
This distinction is important: documentary observations and semantic assertions are different things. The source can be a reliable library, museum catalogue, your own collection or work.
Enter the proposed classifications
We now begin entering the assertions that will be reviewed.
Each reviewable property may have three related columns:
| Column | Purpose |
|---|---|
property |
Proposed value |
property_range |
Available choices for review |
property_definition |
Optional semantic definition or reference |
The _range and _definition columns support
the review. They are not additional assertions about the subject.
Classification with instance_of
The instance_of property describes what kind of entity
each subject is.
Column: instance_of
object
object
object
photograph
photograph
photograph
We have deliberately used broad classifications. The reviewer may
decide that a more specific classification is appropriate. For example,
item2 could be classified as handwear rather
than the general category object.
Define the available classifications
The instance_of_range column provides possible choices
for the reviewer.
For this exercise, use:
object | shirt | handwear | sweater | drawing | photograph | other
Copy this complete string into all six cells of the
instance_of_range column.
The pipe character (|) separates alternatives.
The special value other allows the reviewer to propose a
value outside the predefined list. The range is not an assertion that
all listed classifications are correct. It is a set of choices offered
during review.
Leave instance_of_definition empty for this
exercise.
Describe the dual relationships
The next two properties describe the relationships between objects and photographs.
The depicts property
The depicts property identifies the entity represented
by a photograph.
Column: depicts
No value possible
No value possible
No value possible
item1
item2
item3
The first three entities are museum objects, not photographs.
In this example, the proposed value No value possible
indicates that the property is not applicable to those entities in the
intended model. In our model, only a photograph depicts something. If
the item is a glove or a shirt, it does not depict, it is depicted by
the photograph.
For the photographs, the values identify the represented objects. The reviewer may confirm or correct these proposals.
Column: depicts_range
Copy the following complete string into all six cells:
item1 | item2 | item3 | No value possible | other
Leave depicts_definition empty.
The depicted_by property
The reciprocal property depicted_by identifies a
photograph representing an entity.
Column: depicted_by
item4
item5
item6
No value possible
No value possible
No value possible
The first three entities are represented by photographs.
The final three entities are themselves photographs, so this exercise
proposes No value possible for their
depicted_by values.
Column: depicted_by_range
Copy the following complete string into all six cells:
item4 | item5 | item6 | No value possible | other
Leave depicted_by_definition empty.
Why review both directions?
The two relationships are logically related, but the candidate dataset records them separately.
For example:
item1 -- depicted_by --> item4
item4 -- depicts -----> item1
If a reviewer changes one relationship, the other should also be examined.
Betwixt does not need to assume that every candidate relationship is correct merely because its reciprocal relationship has also been proposed.
This illustrates a general principle of semantic review: related assertions may be checked independently, while their consistency can be assessed as part of the review process.
Review cultural heritage associations
The heritage_of property introduces a different type of
review question.
A museum record may describe an object without providing sufficient evidence to determine its cultural heritage affiliation.
We should not infer that an object belongs to Estonian cultural heritage merely because it appears in an Estonian museum information system.
For this reason, all six candidate values are initially missing.
Column: heritage_of
Leave all six cells empty.
Column: heritage_of_range
Copy the following string into all six cells:
Estonians | Livonians | Latvians | No value possible | Value unknown | other
Leave heritage_of_definition empty.
Missing values and review choices
There is an important difference between an empty candidate cell and an explicit statement about the availability of a value.
An empty candidate cell means that no value has been supplied.
Value unknown expresses that the value is applicable but
not known.
No value possible expresses that the property has no
applicable value.
The option other allows the reviewer to propose a value
not listed among the available alternatives.
In this example, No value possible and
Value unknown are included as explicit choices in the
candidate ranges. Their precise semantic handling depends on the review
implementation; they should not be confused with ordinary empty
cells.
Add contextual information
Some information may be useful to display without making it a reviewable assertion.
The context_held_by column demonstrates this
possibility. Every column that you may add later in Excel or Google
Spreadsheets or a similar application that start context_
will be displayed but not subject to revision by the reviewer.
Column: context_held_by
Estonian National Museum
Estonian National Museum
Estonian National Museum
Estonian National Museum
Estonian National Museum
Estonian National Museum
This is illustrative contextual information for the exercise, not a verified attribution of these three records to the Estonian National Museum.
Unlike instance_of or heritage_of, the
context_held_by column is not accompanied by
_range or _definition columns, because its
value cannot be changed during the use of the review table. It is
displayed as context rather than offered for review.
Define the subject range
The subject_range column provides the possible subject
identifiers for review.
Copy the following string into all six cells:
item1 | item2 | item3 | item4 | item5 | item6 | other
Leave subject_definition empty.
At this point, the spreadsheet contains six candidate entities and four reviewable properties.
Save the workbook.
Import the completed spreadsheet into R
Return to R.
The readxl package can import the Excel workbook without
requiring Microsoft Excel to be installed.
candidates <- readxl::read_excel(
"muis-dual-representation.xlsx",
col_types = "text"
)
candidates$row_id <- as.integer(candidates$row_id)Reading the columns as text prevents identifiers and URLs from being inadvertently converted into numeric or date values.
The row_id column is then explicitly converted to
integer.
You can inspect the imported data:
dplyr::glimpse(candidates)
candidates[, c(
"row_id",
"subject",
"instance_of",
"depicts",
"depicted_by",
"heritage_of"
)]The result should contain six rows.
Validate the candidate dataset
Before rendering the review, validate the imported table.
validate_candidate_dataset(candidates)Validation checks whether the table satisfies the structural requirements of a Betwixt candidate dataset.
These include:
- A
row_idcolumn containing unique positive integers. - A
subjectcolumn. - Appropriate character values in descriptive columns.
- Correctly paired assertion, range, and definition columns.
Validation is not semantic verification.
It does not establish whether a museum object has been correctly classified, whether a photograph represents the proposed object, or whether the cultural heritage association is justified.
Those are questions for review.
Render a standalone HTML review
After successful validation, the candidate dataset can be rendered as a standalone HTML document.
render_review(
candidates,
title = "Exercise 7: Objects and photographic representations",
description = paste(
"Six entities are proposed for registration in a database:",
"three museum objects and three photographs.",
"Review their classifications and the relationships between them.",
"Check both depicts and depicted_by.",
"Determine the appropriate cultural heritage associations.",
"The holding institution is provided as contextual information."
),
reviewer_name = "",
reviewer_iri = "",
table_id = "muis_dual_representation_example",
row_comment = TRUE,
review_comment = TRUE,
filename_stem = "muis_dual_representation_example",
path = "."
)The resulting HTML document can be opened in a browser.
The reviewer can inspect the photographic evidence, open the MuIS source records, review proposed values, enter corrections, and record comments.
The reviewer does not need to use R or Excel to complete the review.
Understand the review lifecycle
The spreadsheet represents the candidate state.
The HTML review introduces a separate reviewed state.
This distinction is fundamental to Betwixt: the reviewer does not silently overwrite the original candidate assertions.
For example, a candidate classification might be:
item2 -- instance_of --> object
A reviewer may propose a more specific classification:
item2 -- instance_of --> handwear
The original candidate and the reviewed assertion can both be retained.
The review may also record whether an assertion was corroborated, corrected, rejected, or deferred, together with associated comments and provenance.
A saved review can be reopened and continued. Finalisation marks the review activity as complete.
Read the completed review into R
After finalisation, the HTML review can be imported into R.
The exact filename depends on the output generated during review.
For example:
completed <- read_review(
"muis_dual_representation_example_1-finalised.html"
)
completed$candidate
completed$reviewed
completed$provenanceThe candidate and reviewed states remain distinct.
Betwixt also provides projections of the reviewed information:
wide <- project_review_wide(completed)
long <- project_review_long(completed)The wide representation aligns candidate, reviewed, and status information.
The long representation expresses individual assertions and their review states in a more normalised structure.
Finalising a review does not automatically modify MuIS or another external knowledge system.
Candidate provenance
Preparing a candidate dataset and reviewing its assertions are two different activities.
The person preparing the spreadsheet may select records, introduce entity identifiers, propose classifications, and construct relationships.
A reviewer may subsequently confirm or challenge those proposals.
These activities should not be confused.
A plain Excel workbook contains the candidate table, but does not automatically provide the dataset-level preparation provenance that may be attached through a programmatic candidate-dataset workflow.
For reproducible work, it is useful to record:
- Who prepared the candidate dataset.
- Which source records were used.
- When the candidate dataset was prepared.
- Which modelling decisions were made before review.
The MuIS example demonstrates why this matters. The decision to represent three museum records as six entities is itself a modelling decision made during candidate preparation.
The reviewer is being asked to evaluate that proposal, not merely transcribe information from the museum records.
Conclusion
This vignette has demonstrated how to prepare a Betwixt candidate dataset in Excel without constructing the records programmatically.
Starting from three museum records, we created six candidate entities, supplied documentary evidence, proposed classifications, described reciprocal relationships, and left cultural heritage associations open for review.
The completed spreadsheet can be validated in R and rendered as a standalone HTML review.
The essential distinction is between evidence, candidate assertions, contextual information, and reviewed assertions.
Excel provides an accessible environment for preparing the candidate state. Betwixt provides the structured review workflow that preserves the distinction between the original proposals and subsequent decisions.