if (objectsLeft.isEmpty())\r
break;\r
\r
+ \r
// process compares objects that are identified and searches for more resources to process. \r
process(objectsLeft, objectsRight, unreliableLeft, unreliableRight);\r
+ // process unreliable handles cases where unidentified statements subject and object have been identified \r
+ processUnreliable(unreliableLeft, unreliableRight);\r
// process unreliable handles cases where unidentified resources have path of length one to identified resource\r
processUnreliable(unreliableLeft, unreliableRight,objectsLeft,objectsRight);\r
if (objectsLeft.isEmpty() && unreliableLeft.size() > 0 && unreliableRight.size() > 0) {\r
while (!objectsLeft.isEmpty()) {\r
Resource r1 = objectsLeft.pop();\r
Resource r2 = objectsRight.pop();\r
+ \r
+ if (r1.equals(r2))\r
+ continue;\r
\r
if (comparableResources.contains(r1, r2)) {\r
//System.out.println("already tested " + NameUtils.getSafeName(g, r1) + " " + NameUtils.getSafeName(g, r2));\r
continue;\r
}\r
+ if (comparableResources.containsLeft(r1) || comparableResources.containsRight(r2)) {\r
+ throw new DatabaseException("Comparator error: Trying to map " + r1 + " to " + r2 + " while mappings " + r1 + " to " + comparableResources.getRight(r1) + " and " + comparableResources.getLeft(r2) + " to " + r2 + " exist.");\r
+ }\r
comparableResources.map(r1, r2);\r
\r
//System.out.println("test " + NameUtils.getSafeName(g, r1) + " " + NameUtils.getSafeName(g, r2));\r
}\r
}\r
}\r
+ \r
+ private void processUnreliable(Set<Statement> unreliableLeft, Set<Statement> unreliableRight) {\r
+ MapList<Resource,Statement> subjectLeft = new MapList<Resource, Statement>();\r
+ MapList<Resource,Statement> subjectRight = new MapList<Resource, Statement>();\r
+ MapList<Resource,Statement> objectLeft = new MapList<Resource, Statement>();\r
+ MapList<Resource,Statement> objectRight = new MapList<Resource, Statement>();\r
+ \r
+ for (Statement s : unreliableLeft) {\r
+ subjectLeft.add(s.getSubject(),s);\r
+ objectLeft.add(s.getObject(),s);\r
+ }\r
+ for (Statement s : unreliableRight) {\r
+ subjectRight.add(s.getSubject(),s);\r
+ objectRight.add(s.getObject(),s);\r
+ }\r
+ \r
+ for (Resource left : subjectLeft.getKeys()) {\r
+ if (!comparableResources.containsLeft(left))\r
+ continue;\r
+ Resource right = comparableResources.getRight(left);\r
+ for (Statement leftS : subjectLeft.getValues(left)) {\r
+ Resource leftO = leftS.getObject();\r
+ if (!comparableResources.containsLeft(leftO)) \r
+ continue;\r
+ if (!unreliableLeft.contains(leftS))\r
+ continue;\r
+ Resource rightO = comparableResources.getRight(leftO);\r
+ for (Statement rightS : subjectRight.getValues(right)) {\r
+ if (!rightS.getObject().equals(rightO))\r
+ continue;\r
+ if (!unreliableRight.contains(rightS))\r
+ continue;\r
+ if (leftS.getPredicate().equals(rightS.getPredicate()) ||\r
+ comparableResources.contains(leftS.getPredicate(), rightS.getPredicate())) {\r
+ unreliableLeft.remove(leftS);\r
+ unreliableRight.remove(rightS);\r
+ comparableStatements.map(leftS, rightS);\r
+ }\r
+ }\r
+ }\r
+ \r
+ }\r
+ }\r
+ \r
private void processUnreliable(Set<Statement> unreliableLeft, Set<Statement> unreliableRight, Stack<Resource> objectsLeft, Stack<Resource> objectsRight) {\r
MapList<Resource,Statement> subjectLeft = new MapList<Resource, Statement>();\r
MapList<Resource,Statement> subjectRight = new MapList<Resource, Statement>();\r
objectsRight.add(or);\r
for (int l = 0; l < left.size(); l++) {\r
int r = indices.first[l];\r
- comparableStatements.map(left.get(l), right.get(r));\r
- unreliableLeft.remove(left.get(l));\r
- unreliableRight.remove(right.get(r));\r
+ Statement sl = left.get(l);\r
+ Statement sr = right.get(r);\r
+ addComparable(sl, sr, true);\r
+ unreliableLeft.remove(sl);\r
+ unreliableRight.remove(sr);\r
}\r
\r
}\r
return new GraphChanges(r1,r2,changes1,changes2,modifications,comparableResources);\r
}\r
\r
+ private void addComparable(Statement left, Statement right, boolean process) {\r
+ comparableStatements.map(left, right);\r
+ if (!process) {\r
+ comparableResources.map(left.getObject(), right.getObject());\r
+ }\r
+ }\r
+ \r
public List<Statement> filterAsserted(Resource r, Collection<Statement> in) throws ServiceException {\r
List<Statement> out = new ArrayList<Statement>();\r
for (Statement s : in) {\r
}\r
return out;\r
}\r
- \r
+\r
private String printStatement(ReadGraph graph, Statement s) throws ValidationException, ServiceException {\r
return NameUtils.getSafeName(graph, s.getSubject()) + " " + NameUtils.getSafeName(graph, s.getPredicate()) + " " + NameUtils.getSafeName(graph, s.getObject());\r
}\r
}\r
\r
private int compareObject(Resource o1, Resource o2) throws DatabaseException {\r
+ if (o1.equals(o2))\r
+ return -1;\r
if (comparableResources.contains(o1, o2))\r
return (-1);\r
if (comparableResources.containsLeft(o1))\r
objectsLeft.add(s1.getObject());\r
objectsRight.add(s2.getObject());\r
} \r
- comparableStatements.map(s1, s2);\r
- //comparableResources.map(s1.getObject(), s2.getObject());\r
+ addComparable(s1, s2, true);\r
break;\r
}\r
}\r
boolean eq = compareValue(v1, v2);\r
if (!eq) {\r
addModification(s1, s2);\r
- comparableStatements.map(s1, s2);\r
- comparableResources.map(s1.getObject(),s2.getObject());\r
+ addComparable(s1, s2, false);\r
}\r
} else {\r
compareProps(s1.getObject(), s2.getObject());\r
}\r
} else {\r
addModification(s1, s2);\r
- comparableStatements.map(s1, s2);\r
- comparableResources.map(s1.getObject(),s2.getObject());\r
+ addComparable(s1, s2, false);\r
}\r
i1++;\r
i2++;\r