Skip to content

Commit b6fc4a6

Browse files
Merge pull request #30 from OwnYourData/generalization_remove_min_and_max
Max/min of edge buckets are obfuscated
2 parents c9be105 + b8cd5a1 commit b6fc4a6

4 files changed

Lines changed: 48 additions & 26 deletions

File tree

src/main/java/com/example/anonymization/data/QueryBuildingService.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,22 @@ static ParameterizedSparqlString createPropertyQuery(Resource objectType) {
150150
static ParameterizedSparqlString createGeneralizationData(Set<Property> properties, Resource anonymizationObject) {
151151
ParameterizedSparqlString queryString = new ParameterizedSparqlString();
152152
queryString.append("SELECT ?object");
153-
properties.forEach(property -> queryString.append(" ?_min_" + property.getLocalName() + " ?_max_" + property.getLocalName()));
153+
properties.forEach(property -> {
154+
queryString.append(" ?_" + property.getLocalName());
155+
queryString.append(" ?_min_" + property.getLocalName());
156+
queryString.append(" ?_max_" + property.getLocalName());
157+
});
154158
queryString.append("\nWHERE {\n");
155159
queryString.append(" ?object a <" + anonymizationObject.getURI()+ ">.\n");
156160
properties.forEach(property -> {
157-
queryString.append(" OPTIONAL { ?object ?" + property.getLocalName() + " ?_" + property.getLocalName() + ".\n");
158-
queryString.append(" ?_" + property.getLocalName() + " <" + Generalization.RDF_MAX + "> ?_max_" + property.getLocalName() + ".\n");
159-
queryString.append(" ?_" + property.getLocalName() + " <" + Generalization.RDF_MIN + "> ?_min_" + property.getLocalName() + ".\n");
160-
queryString.append("}\n");
161+
queryString.append(" OPTIONAL { \n");
162+
queryString.append(" ?object ?" + property.getLocalName() + " ?_" + property.getLocalName() + ".\n");
163+
queryString.append(" ?_" + property.getLocalName() + " <" + Generalization.RDF_MAX + "> ?_max_" + property.getLocalName() + ".\n");
164+
queryString.append(" }\n");
165+
queryString.append(" OPTIONAL { \n");
166+
queryString.append(" ?object ?" + property.getLocalName() + " ?_" + property.getLocalName() + ".\n");
167+
queryString.append(" ?_" + property.getLocalName() + " <" + Generalization.RDF_MIN + "> ?_min_" + property.getLocalName() + ".\n");
168+
queryString.append(" }\n");
161169
queryString.setParam(property.getLocalName(), property);
162170
});
163171
queryString.append("}");

src/main/java/com/example/anonymization/data/QueryService.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -219,25 +219,24 @@ public static Map<Resource, Map<Property, Literal>> getAllData(Model model, Reso
219219
* @param properties set of properties for which the generalization data is fetched
220220
* @return mapping of resources of the object type with their min and max property values
221221
*/
222-
public static Map<Resource, Map<Property, List<Literal>>> getGeneralizationData(
222+
public static Map<Resource, Map<Property, Literal[]>> getGeneralizationData(
223223
Model model,
224224
Resource objectType,
225225
Set<Property> properties
226226
) {
227-
model.write(System.out);
228227
ParameterizedSparqlString queryString = QueryBuildingService.createGeneralizationData(properties, objectType);
229228
Query query = queryString.asQuery();
230-
Map<Resource, Map<Property, List<Literal>>> results = new HashMap<>();
229+
Map<Resource, Map<Property, Literal[]>> results = new HashMap<>();
231230
try (QueryExecution qe = QueryExecutionFactory.create(query, model)) {
232231
ResultSet rs = qe.execSelect();
233232
while (rs.hasNext()) {
234233
QuerySolution sol = rs.next();
235-
Map<Property, List<Literal>> values = new HashMap<>();
234+
Map<Property, Literal[]> values = new HashMap<>();
236235
properties.forEach(property -> {
237-
Literal minValue = sol.getLiteral("_min_" + property.getLocalName());
238-
Literal maxValue = sol.getLiteral("_max_" + property.getLocalName());
239-
if (minValue != null && maxValue != null) {
240-
values.put(property, List.of(minValue, maxValue));
236+
if (sol.getResource("_" + property.getLocalName()) != null) {
237+
Literal minValue = sol.getLiteral("_min_" + property.getLocalName());
238+
Literal maxValue = sol.getLiteral("_max_" + property.getLocalName());
239+
values.put(property, new Literal[]{minValue, maxValue});
241240
}
242241
});
243242
results.put(sol.getResource("object"), values);

src/main/java/com/example/anonymization/service/FaltJsonService.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public static String createFlatJsonOutput(
9191
.map(Map.Entry::getKey)
9292
.map(p -> model.getProperty(p.getURI() + "_generalized"))
9393
.collect(Collectors.toSet());
94-
Map<Resource, Map<Property, List<Literal>>> generalizationData =
94+
Map<Resource, Map<Property, Literal[]>> generalizationData =
9595
QueryService.getGeneralizationData(model, flatObject, classificationProperties);
9696
Map<Resource, Long> kAnonymity = QueryService.getKAnonymity(model, objectTypes);
9797
Map<Resource, List<QueryService.AttributeInformation>> attributeInformation =
@@ -105,7 +105,7 @@ public static String createFlatJsonOutput(
105105
private static String createFlatJsonString(
106106
Map<Resource, Map<Property, Literal>> data,
107107
Map<Resource, List<Resource>> types,
108-
Map<Resource, Map<Property, List<Literal>>> generalizationData,
108+
Map<Resource, Map<Property, Literal[]>> generalizationData,
109109
Map<Resource, Long> kAnonymity,
110110
Map<Resource, List<QueryService.AttributeInformation>> attributeInformation
111111
) {
@@ -127,7 +127,7 @@ private static ArrayNode addDataToArrayNode(
127127
ObjectMapper mapper,
128128
Map<Resource, Map<Property, Literal>> data,
129129
Map<Resource, List<Resource>> types,
130-
Map<Resource, Map<Property, List<Literal>>> generalizationData
130+
Map<Resource, Map<Property, Literal[]>> generalizationData
131131
) {
132132
ArrayNode dataArray = mapper.createArrayNode();
133133
List<Resource> sortedResources = data.keySet().stream()
@@ -159,14 +159,22 @@ private static ArrayNode addDataToArrayNode(
159159
entryNode.set("types", typesArray);
160160
}
161161

162-
Map<Property, List<Literal>> genAttrs = generalizationData.get(resource);
162+
Map<Property, Literal[]> genAttrs = generalizationData.get(resource);
163163
if (genAttrs != null) {
164-
for (Map.Entry<Property, List<Literal>> genAttr : genAttrs.entrySet()) {
165-
List<Literal> values = genAttr.getValue();
166-
if (values.size() == 2) {
164+
for (Map.Entry<Property, Literal[]> genAttr : genAttrs.entrySet()) {
165+
Literal[] values = genAttr.getValue();
166+
if (values.length == 2) {
167167
ObjectNode genNode = mapper.createObjectNode();
168-
genNode.put("min", values.get(0).getValue().toString());
169-
genNode.put("max", values.get(1).getValue().toString());
168+
if (values[0] == null) {
169+
genNode.put("min", "obfuscated");
170+
} else {
171+
genNode.put("min", values[0].getValue().toString());
172+
}
173+
if (values[1] == null) {
174+
genNode.put("max", "obfuscated");
175+
} else {
176+
genNode.put("max", values[1].getValue().toString());
177+
}
170178
entryNode.set(genAttr.getKey().getLocalName(), genNode);
171179
}
172180
}

src/main/java/com/example/anonymization/service/anonymizer/Generalization.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22

33

44
import com.example.anonymization.entities.Configuration;
5-
import com.example.anonymization.service.KpiService;
65
import com.example.anonymization.data.QueryService;
7-
import lombok.AllArgsConstructor;
86
import org.apache.jena.atlas.lib.Pair;
97
import org.apache.jena.rdf.model.Literal;
108
import org.apache.jena.rdf.model.Model;
119
import org.apache.jena.rdf.model.Property;
1210
import org.apache.jena.rdf.model.Resource;
1311
import org.apache.jena.vocabulary.RDF;
12+
import org.apache.jena.vocabulary.RDFS;
1413

1514
import java.util.*;
1615
import java.util.stream.Collectors;
@@ -72,8 +71,16 @@ protected List<Resource> createBuckets(Model model, int nrOfBuckets, List<Pair<R
7271
List<T> range = getBucketRange(sortedValues, position, nrOfBuckets);
7372
Resource generalizationResource = model.createResource(property.getURI() + "_" + position);
7473
generalizationResource.addProperty(RDF.type, QueryService.SOYA_URL + "generalization");
75-
generalizationResource.addLiteral(min, range.get(0));
76-
generalizationResource.addLiteral(max, range.get(1));
74+
if (position != 0) {
75+
generalizationResource.addLiteral(min, range.get(0));
76+
} else {
77+
generalizationResource.addProperty(RDFS.comment, "For the lower bound the minimum value is obfuscated");
78+
}
79+
if (position != nrOfBuckets - 1) {
80+
generalizationResource.addLiteral(max, range.get(1));
81+
} else {
82+
generalizationResource.addProperty(RDFS.comment, "For the higher bound the maximum value is obfuscated");
83+
}
7784
return generalizationResource;
7885
}).toList();
7986
}

0 commit comments

Comments
 (0)