*\r
*/\r
public class GraphComparator {\r
+ \r
+ private static final boolean DEBUG = false;\r
\r
private Resource r1;\r
private Resource r2;\r
\r
comparator.setComparator(this);\r
\r
+ comparableResources.map(r1, r2);\r
+ \r
final Stack<Resource> objectsLeft = new Stack<Resource>();\r
final Stack<Resource> objectsRight = new Stack<Resource>();\r
objectsLeft.push(r1);\r
}\r
}\r
\r
- private void processUnreliable(Set<Statement> unreliableLeft, Set<Statement> unreliableRight) {\r
+ private void processUnreliable(Set<Statement> unreliableLeft, Set<Statement> unreliableRight) throws DatabaseException {\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
comparableResources.contains(leftS.getPredicate(), rightS.getPredicate())) {\r
unreliableLeft.remove(leftS);\r
unreliableRight.remove(rightS);\r
- comparableStatements.map(leftS, rightS);\r
+ addComparable(leftS, rightS, false);\r
}\r
}\r
}\r
}\r
}\r
\r
- private void processUnreliable(Set<Statement> unreliableLeft, Set<Statement> unreliableRight, Stack<Resource> objectsLeft, Stack<Resource> objectsRight) {\r
+ private void processUnreliable(Set<Statement> unreliableLeft, Set<Statement> unreliableRight, Stack<Resource> objectsLeft, Stack<Resource> objectsRight) throws DatabaseException {\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
List<Statement> right = matchingOR.getValues(or);\r
Pair<int[], int[]> indices = matchingStatements.get(or);\r
\r
- comparableResources.map(ol, or);\r
objectsLeft.add(ol);\r
objectsRight.add(or);\r
+ addComparable(ol, or, false);\r
for (int l = 0; l < left.size(); l++) {\r
int r = indices.first[l];\r
Statement sl = left.get(l);\r
\r
}\r
\r
- private void processUnreliableDeep(Set<Statement> unreliableLeft, Set<Statement> unreliableRight, Stack<Resource> objectsLeft, Stack<Resource> objectsRight) throws ManyObjectsForFunctionalRelationException, ServiceException {\r
+ private void processUnreliableDeep(Set<Statement> unreliableLeft, Set<Statement> unreliableRight, Stack<Resource> objectsLeft, Stack<Resource> objectsRight) throws DatabaseException {\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
for (Path leftPath : pathsLeft) {\r
possiblePathsRight.addAll(findComparableRight(leftPath, or));\r
}\r
- if (possiblePathsRight.size() == pathsLeft.size()) {\r
+ if (hasMatchingPaths(pathsLeft, possiblePathsRight)) {\r
matchingPaths.put(or, possiblePathsRight);\r
}\r
}\r
if (matchingPaths.size() > 0) {\r
if (matchingPaths.size() == 1) {\r
Resource or = matchingPaths.keySet().iterator().next();\r
+ \r
objectsLeft.add(ol);\r
objectsRight.add(or);\r
- comparableResources.map(ol, or);\r
+ addComparable(ol, or, false);\r
Collection<Statement> statementsLeft = objectLeft.getValues(ol);\r
Collection<Statement> statementsRight = objectRight.getValues(or);\r
unreliableLeft.removeAll(statementsLeft);\r
unreliableRight.removeAll(statementsRight);\r
- System.out.println("Compare not implemented");\r
- } else {\r
- System.out.println("Compare not implemented");\r
- }\r
+ BijectionMap<Path,Path> map = getMatchingPaths(pathsLeft, matchingPaths.get(or));\r
+ for (Path left : map.getLeftSet()) {\r
+ Path right = map.getRight(left);\r
+ for (int i = 0; i < left.getLength(); i++) {\r
+ addComparable(left.getStatements().get(i),right.getStatements().get(i),false);\r
+ }\r
+ }\r
+ } \r
}\r
}\r
\r
\r
}\r
\r
+ private boolean hasMatchingPaths(Set<Path> leftPaths, Set<Path> rightPaths) {\r
+ if (leftPaths.size() != rightPaths.size())\r
+ return false;\r
+ BijectionMap<Path,Path> map = getMatchingPaths(leftPaths, rightPaths);\r
+ return map.size() == leftPaths.size();\r
+ \r
+ }\r
+ \r
+ private BijectionMap<Path,Path> getMatchingPaths(Set<Path> leftPaths, Set<Path> rightPaths) {\r
+ BijectionMap<Path,Path> map = new BijectionMap<Path, Path>();\r
+ for (Path leftPath : leftPaths) {\r
+ for (Path rightPath : rightPaths) {\r
+ if (map.containsRight(rightPath))\r
+ continue;\r
+ if (leftPath.getLength() != rightPath.getLength())\r
+ continue;\r
+ if (comparableResources.contains(leftPath.getEnd(), rightPath.getEnd())) {\r
+ map.map(leftPath, rightPath);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ return map;\r
+ }\r
+ \r
private void expand(Set<Path> paths) throws ManyObjectsForFunctionalRelationException, ServiceException {\r
Set<Path> stepPathsLeft = new HashSet<Path>();\r
if (paths.size() == 0)\r
return new GraphChanges(r1,r2,changes1,changes2,modifications,comparableResources);\r
}\r
\r
- private void addComparable(Statement left, Statement right, boolean process) {\r
+ private void addComparable(Statement left, Statement right, boolean process) throws DatabaseException {\r
+ addComparable(left.getObject(), right.getObject(), process);\r
comparableStatements.map(left, right);\r
comparableResources.map(left.getObject(), right.getObject());\r
}\r
\r
+ private void addComparable(Resource left, Resource right, boolean process) throws DatabaseException {\r
+ if(!comparableResources.contains(r1, r2)) {\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
+ } else {\r
+ comparableResources.map(left, right); \r
+ }\r
+ }\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
break;\r
} else {\r
while (i2 < ss2.size()) {\r
- System.out.println("Compare Statements diff2 " + printStatement(g,ss2.get(i2)));\r
+ if (DEBUG) System.out.println("Compare Statements diff2 " + printStatement(g,ss2.get(i2)));\r
\r
addAddition(ss2.get(i2));\r
i2++;\r
}\r
} else if (i2 >= ss2.size()) {\r
while (i1 < ss1.size()) {\r
- System.out.println("Compare Statements diff1 " + printStatement(g,ss1.get(i1)));\r
+ if (DEBUG) System.out.println("Compare Statements diff1 " + printStatement(g,ss1.get(i1)));\r
addDeletion(ss1.get(i1));\r
i1++;\r
}\r
i2+=same2;\r
} else if (c < 0) {\r
for (int i = 0; i < same1; i++) {\r
- System.out.println("Compare Statements diff1 " + printStatement(g,ss1.get(i+i1)));\r
+ if (DEBUG) System.out.println("Compare Statements diff1 " + printStatement(g,ss1.get(i+i1)));\r
addDeletion(ss1.get(i+i1));\r
}\r
i1 += same1;\r
} else {\r
for (int i = 0; i < same2; i++) {\r
- System.out.println("Compare Statements diff2 " + printStatement(g,ss2.get(i+i2)));\r
+ if (DEBUG) System.out.println("Compare Statements diff2 " + printStatement(g,ss2.get(i+i2)));\r
addAddition(ss2.get(i+i2));\r
}\r
\r
}\r
for (int i1 = off1; i1 < off1 + len1; i1++) {\r
if (!used1[i1-off1]) {\r
- System.out.println("Compare Object diff1 " + printStatement(g,ss1.get(i1)));\r
+ if (DEBUG) System.out.println("Compare Object diff1 " + printStatement(g,ss1.get(i1)));\r
addDeletion(ss1.get(i1));\r
}\r
}\r
for (int i2 = off2; i2 < off2 + len2; i2++) {\r
if (!used2[i2-off2]) {\r
- System.out.println("Compare Object diff2 " + printStatement(g,ss2.get(i2)));\r
+ if (DEBUG) System.out.println("Compare Object diff2 " + printStatement(g,ss2.get(i2)));\r
addAddition(ss2.get(i2));\r
}\r
}\r
* @throws DoesNotContainValueException\r
* @throws ValidationException \r
*/\r
- private void compareProps(Resource r1, Resource r2) throws ServiceException, DoesNotContainValueException, ValidationException {\r
- System.out.println("compareProps " + r1 + " " + NameUtils.getSafeName(g, r1) + " " + r2 + " " + NameUtils.getSafeName(g, r2));\r
+ private void compareProps(Resource r1, Resource r2) throws DatabaseException {\r
+ if (DEBUG) System.out.println("compareProps " + r1 + " " + NameUtils.getSafeName(g, r1) + " " + r2 + " " + NameUtils.getSafeName(g, r2));\r
ArrayList<Statement> ss1 = new ArrayList<Statement>();\r
ArrayList<Statement> ss2 = new ArrayList<Statement>();\r
ss1.addAll(g.getStatements(r1, b.HasProperty));\r
break;\r
else {\r
while (i2 < ss2.size()) {\r
- System.out.println("Compare Prop diff2 " + printStatement(g,ss2.get(i2)));\r
+ if (DEBUG) System.out.println("Compare Prop diff2 " + printStatement(g,ss2.get(i2)));\r
addAddition(ss2.get(i2));\r
i2++;\r
}\r
}\r
} else if (i2 >= ss2.size()) {\r
while (i1 < ss1.size()) {\r
- System.out.println("Compare Prop diff1 " + printStatement(g,ss1.get(i1)));\r
+ if (DEBUG) System.out.println("Compare Prop diff1 " + printStatement(g,ss1.get(i1)));\r
addDeletion(ss1.get(i1));\r
i1++;\r
}\r
break;\r
}\r
case -1:{\r
- System.out.println("Compare Prop diff1s " + printStatement(g,s1));\r
+ if (DEBUG) System.out.println("Compare Prop diff1s " + printStatement(g,s1));\r
addDeletion(s1);\r
i1++;\r
break;\r
}\r
\r
case 1:{\r
- System.out.println("Compare Prop diff2s " + printStatement(g,s2));\r
+ if (DEBUG) System.out.println("Compare Prop diff2s " + printStatement(g,s2));\r
addAddition(s2);\r
i2++;\r
break;\r