Showing posts with label Computational Provenance Research. Show all posts
Showing posts with label Computational Provenance Research. Show all posts

Oct 24, 2025

Holocaust art research digital tools: Lempertz and artworks listed in the (defunct) Nazi Era Internet Portal

Art provenance research tools:

The Cologne auction house of Lempertz was included in the Art Looting Investigation Unit Red Flag list of names in 1946. In recent times, the name has appeared in connection to several claims for restitution of artworks. Until recently American museums published artworks that had gaps in their provenance 1933-1945 in a database called NEPIP (Nazi Era Provenance Internet Portal) (https://www.aam-us.org/programs/the-nazi-era-provenance-internet-portal-nepip-archive/)

This video shows artworks gathered from NEPIP and other sources that mention the word "Lempertz" in the provenance published by museums. 

Note: Some of the mentions concern the German auction house. Some do not. Some concern transactions prior to 1933, others after 1933. Inclusion on the list does not mean that the artwork was looted or sold in a forced sale, only that it contains a specific word.

Link to database used in video: https://public.flourish.studio/visualisation/9769949/ (Enter the word or name you want to search for in the box)

German sales catalogues published by the Getty Provenance Index and Heidelberg University tend to stop or peter out after 1945, so it is very difficult to use digital tools to analyze Lempertz and other auction sales in the 1950s and 1960s and 1970s when Nazi looted artworks were laundered via auction houses with little scrutiny. 

Gathering mentions of Lempertz (and other auction houses) in museums provenances is one workaround for this lack of transparency.

Link to Getty Provenance Index

https://www.getty.edu/databases-tools-and-technologies/provenance/

Link to CSV file downloaded from old Getty GPI for search on Lempertz

https://docs.google.com/spreadsheets/d/e/2PACX-1vTJweR5KAilTRyV0naGWjbLpXjfCNes52bUms-901DtZv99GWDBfi4HMxJfrOVFWEiRa21MAtmXDl6E/pub?gid=1417510852&single=true&output=csv

Link to Heidelberg University German Sales catalogues

https://digi.ub.uni-heidelberg.de/en/germansales//recherche/volltext.html

(photo credit from MFA, Boston museum, The Cumaean Sibyl Donato Creti (Italian (Bolognese), 1671–1749) about 1730 ACCESSION NUMBER 1984.138 PROVENANCE November 23-25, 1983, anonymous (German private collector) sale, Lempertz, Cologne, lot 1482. 1984, sold by Piero Corsini, New York and London, to the MFA. (Accession Date: April 11, 1984) https://collections.mfa.org/objects/34617/the-cumaean-sibyl

Oct 14, 2025

How AI summarizes the work of the Germany Advisory Commission

 The following table, created with the AI document analysis tool NotebookLLM, details the claimants, their persecuted ancestors, the artworks subject to the claim, and the recommendation made by Germany's Advisory Commission, which will shut down in November 2025. (Highlights in yellow added by OAD)

It was created by loading the Commission Reports into NotebookLLM and asking the question: list claimants, their persecuted ancestors, the artworks claimed and the decision of the commission

How accurate is NotebookLLM's summary?

ClaimantsPersecuted Ancestor(s)Artworks ClaimedDecision of the Commission
Heirs of A. B.(Community of Heirs, represented by Dr. D. B.)A. B. (d. 1938) and his four children (C., D., E., and F.)Painting Das Zitronenscheibchen(Lemon Slice) (c. 1667) by Jacob OchterveltRecommend the restitution of the painting. This was based exclusively on moral and ethical considerations, not legal assessment. The restitution included the stipulation that if the painting is sold within 10 years, the state of Bavaria is to receive 50% of the proceeds.
Heirs of Laura Baumann (Karl Ernst Baumann, grandson)Laura Baumann (d. 1940)Painting Portrait der Familie von Dithfurth by Johann J. August von der EmbdeRecommend that the painting remain in the museum, and the claimant be paid €10,000 compensation.
Heirs of George E. Behrens(Community of heirs)George Eduard Behrens (1881–1956)Painting Pariser Wochentag (Weekday in Paris) (1869) by Adolph von MenzelCannot recommend returning the painting.

May 31, 2025

Knoedler's ledgers: mapping missing entry dates and seller names

 


data source: Getty Provenance Index GitHub Knoedler file  13 Dec 2017

(analysis performed  on CSV file before GPI remodel)

Note:  Transactions prior to 1925 or in the Stockbooks 1-7 have been removed from this file, reducing the number of transactions from 40,250 to 13,809.  This enables us to focus on the years 1928 to 1970.

Three huge spikes in activity pop out: 1951, 1928 and 1942. But before we examine what happened in those years to create such a spike, we must deal with a problem of missing data.

Of the above transactions, 1,746 lack an entry date year. That's over 10%! More than even our highest peak!

What to do? Data scientists often "clean" datasets by eliminating rows with incomplete data. That is exactly what we will NOT do. Instead of eliminating these rows of incomplete data from our data set, we will focus on them. 

Why are these 1,746 transactions missing the entry date year? Do they have anything else in common?

What other indicators might supply us with the missing information? Proxies, in short, for the entry date year. (Names associated with specific date ranges, for example).


The Stock Book Numbers 1928-1970



The Stock Book Numbers for transactions with no Entry Date Year


We see that most of the missing years are from Stock Book 11.  

What else can we learn about the profile of the missing dates? We can compare the most frequent nationalities of all transactions 1928-1970 



to the nationalities of the transactions missing entry date years:


The largest contingent are American.  We don't understand this but will file it away, hoping that it might Make sense later.


What about the sellers? And here we are in for a bit of a surprise.


Of the 1,746 transactions that have no entry year, the vast majority - 1,481 - also have no seller.


What kind of ledgers are these that Knoedler was keeping, with neither year nor seller? 

Which ledgers are most concerned by this double absence?




With 1,469 mysterious transactions, it's Stock Book 11. 

Who are the joint owners listed in Book 11 ledger entrees which have no entry date or seller name?

(filter: Joint owner appear at least twice)

Joint Own Auth 1

Count

Knoedler Numbers in Book 11

Pinakos, Inc. (Rudolf Heinemann)

84

A6420, A5321, A4774, A6680, A5326, A5434, A1825, A1834, A1845, A1849, A1943, A1944, A1945, A1946, A2523, A2730, A2770, A2774, A2795, A2964, A3026, A3029, A3044, A3049, A3274, A3292, A3300, A3312, A3527, A5250, A5286, A5467, A5469, A5515, A5624, A5708, A5730, A4542, A4824, A4839, A4840, A4843, A4844, A4849, A4851, A4854, A4898, A4920, A4937, A4940, A4955, A5117, A5213, A5944, A5948, A5960, A5963, A5964, A5965, A5982, A6010, A6122, A6777, A6679, A6593, A6548, A6530, A6501, A6500, A6430, A6415, A6318, A6310, A6299, A6295, A6294, A7059, A6998, A6970, A6932, A7109, A5602, A5603, A6826

Hirschl & Adler Galleries

37

A3815, A4107, A3884, A3886, A3873, A3875, A3876, A3880, A3882, A3883, A3885, A3888, A5284, A5319, A5560, A5561, A5737, A5738, A5788, A5806, A5807, A5928, A6102, A6738, A6727, A6726, A6722, A6721, A6704, A6651, A7047, A7046, A7021, A7005, A7004, A6972, A7125

Spark, Victor David

25

A6144, A3188, A5745, A4448, A4923A, A4923C, A4923D, A4923H, A4923I, A4923K, A4923L, A4923M, A4923O, A4923P, A4923Q, A4923R, A4923S, A4923T, A4923W, A5016, A6013, A6018, A6138, A6145, A6147

Berggruen (Heinz), Galerie & Cie

23

A5750, A6640, A7031, A7030, A7029, A6899, A7119, A7120, A6070, A6073, A6114, A6112, A6150, A7018, A7017, A7016, A7015, A6844, A6843, A6443, A6350, A6347, A6641

Schempp, (Theodore), & Co.

13

A6934, A5188, A6684, A7066, A7002, A7001, A7000, A6942, A6939, A6935, A7116, A7130, A7131

Kennedy Galleries, Inc.

13

A4936, A7127, A7128, A7129, A5581, A6272, A6273, A6274, A7124, A7135, A5074, A5075, A6669

Fine Arts Associates

11

A5304, A5209, A6764, A6739, A7039, A6869, A7114, A7115, A7133, A7134, A6922

The A.B. Closson Jr. Co.

9

A5079, A5080, A5082, A5083, A5085, A5086, A5087, A5088, A5089

Betty McLean Gallery

9

A5288, A5290, A5291, A5292, A5294, A5299, A4684, A4685, A5055

E. and A. Milch

7

A3655, A3855, A3857, A3858, A4635, A6824, A7136

Marlborough-Gerson Gallery

7

A7078, A7080, A7082, A7081, A7083, A7077, A7079

Pearlman, Henry

6

A7086, A7087, A7089, A7090, A7091, A7088

Kleemann Galleries

6

A4617, A6432, A6391, A6390, A6332, A6331

De Hauke & Co.

5

A6763, A7100, A7101, A7103, A7110

Frank Perls Gallery

5

A6506, A6230, A6762, A6743, A6435

Balay, Roland

5

A3834, A3835, A3836, A3837, A3838

Latendorf Bookshop

5

A6249, A6250, A6251, A6252, A6253

Agnew's

5

A5435, A6098, A6099, A6228, A7056

Old Print Shop, The

4

A5714, A5716, A5718, A4672E

Weitzner, Julius H.

4

A6921, A5703, A6534, A6929

Charell, Ludwig

3

A6379, A6378, A6377

Babcock Galleries

3

A3413, A3661, A5072

Galerie les Tourettes (Otto Wertheimer)

2

A5281, A7117

John F. Fleming Rare Book Co.

2

A6388, A6387

Galerie des Arts Anciens et Modernes

2

A6135, A6313

SUTTON, HILDA

2

A3383, A3395

Louis Leon and Co.

2

A6801, A6525

Michelotti, M.

2

A5320, A4049

Ward Eggleston Galleries

2

A5991, A5992

Kernochan, Katherine Lorillard

2

A2144, A2145

Ackermann, (Arthur), and Son

2

A3600, A2556

Frederick A. Stern Inc.

2

A3068, A3206

Weil, (André), Galerie

2

A6701, A6795

STRĂ–LIN, ALFRED

2

A6478, A6477

Abdy, Robert Henry Edward, Sir, 5th Bart.

2

A7009, A6967

Colnaghi's

2

A1982, A3060

Where else do these Knoedler numbers appear? What do they tell us?



Can the recent publication of the new Getty Provenance Index on linked data principles help us to go further in the analysis of the information that is missing from the original Knoedler ledgers? How might we do this?

tbc...

Mar 28, 2025

VIDEO Detecting Deception: A Computational Approach to Detecting Nazi-looted Art

Description*: 

Researching a Rigged Game: Open Source Data & the Trade of Cultural Objects, September 14 and 15, 2023. This YouTube video transcript presents a computational method for detecting potentially Nazi-looted art by analyzing the language used in artwork provenance records. The speaker, Laurel Zuckerman, explains how counting words indicating uncertainty, unreliability, and anonymity can reveal patterns suggestive of deception, drawing inspiration from her own experience with a family artwork. A software tool is demonstrated that allows users to upload provenance data and custom lists of keywords to quantify these indicators. While acknowledging limitations and the need for further research, the approach offers a scalable and objective way to prioritize artworks for closer scrutiny regarding their wartime history.

Mar 3, 2025

Data Visualization of Double Itineraries: Schiele artwork and persecuted Jewish owner

Richard Lanyi was killed in the Holocaust but artworks, like this Schiele, from his collection ended up in museums.

This dataviz shows two itineraries: that of the paintings "Offenbarung" by Egon Schiele (on the top) and, connected to it, that of Richard Lanyi, who owned the artwork before being deported and murdered by Nazis in the Holocaust.


Below is the code to run in Google Colab

https://colab.research.google.com/drive/10eMNAVfg_v9t3ndttibBNzh2U1iKYl_a?usp=sharing

This Google Colab notebook will create a data visualization based on the provenance information published by the Austrian Commission at https://web.archive.org/web/20220703142133/https://www.bmkoes.gv.at/dam/jcr:2d092829-c6e9-43ae-9073-f8d77cb1d219/dossier_lanyi.pdf

You can replace the data in this file with your own data and run it.

(The python code was created by ChatGPT4O after a conversation involving a dozen iterative prompts.)

---


import matplotlib.pyplot as plt
import networkx as nx
import textwrap
from google.colab import files # Import files module for download

# Function to wrap text labels for better readability
def wrap_labels(labels, width=12):
return {k: "\n".join(textwrap.wrap(v, width)) for k, v in labels.items()}

# Define the ownership timeline of the artwork
ownerships = [
("Egon Schiele", "Dr. Hermann Engel"),
("Dr. Hermann Engel", "Richard Lanyi"),
("Richard Lanyi", "Hans Zernatto"),
("Hans Zernatto", "LB (Hans Zernatto's daughter)"),
("LB (Hans Zernatto's daughter)", "Rudolf Leopold"),
("Rudolf Leopold", "Leopold Museum")
]

# Define Richard Lanyi's persecution itinerary
lanyi_itinerary = [
("Richard Lanyi", "Nazi Targeting (1938)"),
("Nazi Targeting (1938)", "Bookstore Shut Down (1938)"),
("Bookstore Shut Down (1938)", "Johannes Katzler Takes Over (1938)"),
("Johannes Katzler Takes Over (1938)", "Financial Constraints (1938-1942)"),
("Financial Constraints (1938-1942)", "Gestapo Arrest (1942)"),
("Gestapo Arrest (1942)", "Deportation to Auschwitz (1942)"),
("Deportation to Auschwitz (1942)", "Murdered in Auschwitz (1942)")
]

# Define timeline years
timeline_years = [1910, 1920, 1930, 1940, 1950, 1960]

# Positioning nodes: Artwork ownership above, Lanyi's path below
owner_positions = {
"Egon Schiele": (1910, 2),
"Dr. Hermann Engel": (1920, 2),
"Richard Lanyi": (1930, 2),
"Hans Zernatto": (1940, 2),
"LB (Hans Zernatto's daughter)": (1950, 2),
"Rudolf Leopold": (1960, 2),
"Leopold Museum": (1970, 2)
}

# Adjusted Y positions for better readability and spacing of Lanyi's path
improved_lanyi_positions = {
"Nazi Targeting (1938)": (1938, -1),
"Bookstore Shut Down (1938)": (1938.5, -2),
"Johannes Katzler Takes Over (1938)": (1939, -3.2),
"Financial Constraints (1938-1942)": (1940, -4.5),
"Gestapo Arrest (1942)": (1942, -6),
"Deportation to Auschwitz (1942)": (1942.5, -7.5),
"Murdered in Auschwitz (1942)": (1943, -9)
}

# Merge both positions
positions = {**owner_positions, **improved_lanyi_positions}

# Wrap labels for better readability
wrapped_owner_labels = wrap_labels({node: node for node in owner_positions.keys()}, width=12)
wrapped_lanyi_labels = wrap_labels({node: node for node in improved_lanyi_positions.keys()}, width=20)

# Create graph
G = nx.DiGraph()
G.add_edges_from(ownerships, color="gray")
G.add_edges_from(lanyi_itinerary, color="darkred")

# Define edge colors
edge_colors = [G[u][v]['color'] for u, v in G.edges()]

# Create figure
plt.figure(figsize=(12, 12))

# Draw ownership path above the timeline
nx.draw_networkx_nodes(G, positions, nodelist=owner_positions.keys(), node_color="steelblue", node_size=3500, edgecolors="black")
nx.draw_networkx_edges(G, positions, edgelist=ownerships, edge_color="gray", arrows=True, width=2)
nx.draw_networkx_labels(G, positions, labels=wrapped_owner_labels, font_size=10, font_weight="bold", font_family="serif", font_color="white") # White text for better contrast

# Draw Lanyi's persecution path below the timeline with stronger visual impact
nx.draw_networkx_edges(G, positions, edgelist=lanyi_itinerary, edge_color="darkred", arrows=True, width=2.5, style="dashed")

# Display Lanyi’s persecution labels with bold emphasis
for node, (x, y) in improved_lanyi_positions.items():
plt.text(x, y, wrapped_lanyi_labels[node], fontsize=10, ha="center", fontweight="bold", color="darkred", fontfamily="serif")

# Draw the enhanced timeline with stronger markers
for year in timeline_years:
plt.scatter(year, 0, color="black", s=120) # Larger timeline markers
plt.text(year, 0.4, str(year), fontsize=11, ha="center", fontweight="bold", fontfamily="serif")

# Add dashed timeline line
plt.axhline(0, color="black", linestyle="dashed", linewidth=1.5)

# Title and annotations
plt.title("Itinerary of Egon Schiele's 'Offenbarung' (Above) and Richard Lanyi's Persecution (Below)",
fontsize=14, fontweight="bold", fontfamily="serif")

# Subtitle for context
plt.text(1925, 3, "Tracing the Fate of an Artwork and Its Jewish Collector", fontsize=12, fontweight="bold", color="black", fontfamily="serif")

# Final annotation to emphasize injustice
plt.text(1943, -10, "Richard Lanyi was murdered in Auschwitz in 1942.\nHis collection was lost to history.",
fontsize=11, fontweight="bold", color="darkred", fontfamily="serif", ha="center")

# Adjust display settings
plt.ylim(-10.5, 3.5) # Ensure spacing between sections
plt.xlim(1905, 1975)
plt.xticks([]) # Hide automatic ticks

# Save the figure to a file
filename = "Schiele_Offenbarung_Lanyi_Itinerary.png"
plt.savefig(filename, dpi=300, bbox_inches="tight")

# Show the plot
plt.show()

# Provide a download link for Google Colab users
files.download(filename)