+ 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
+ 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
+ for (Resource ol : objectLeft.getKeys()) {\r
+ Set<Path> pathsLeft = new HashSet<Path>();\r
+ for (Resource rel : traversed) {\r
+ pathsLeft.addAll(Path.create(g.getStatements(ol, rel)));\r
+ }\r
+ while (true) {\r
+ expand(pathsLeft);\r
+ if (pathsLeft.size() == 0)\r
+ break;\r
+ Collection<Path> endPaths = new ArrayList<Path>(1);\r
+ for (Path p : pathsLeft) {\r
+ if (comparableResources.containsLeft(p.getEnd())) {\r
+ endPaths.add(p);\r
+ }\r
+ }\r
+ if (endPaths.size() > 0) {\r
+ pathsLeft.clear();\r
+ pathsLeft.addAll(endPaths);\r
+ break;\r
+ } \r
+ }\r
+ if (pathsLeft.size() > 0) {\r
+ Resource sl = objectLeft.getValues(ol).get(0).getSubject();\r
+ Resource sr = comparableResources.getRight(sl);\r
+ Collection<Resource> possibleOR = new ArrayList<Resource>();\r
+ for (Statement s : subjectRight.getValues(sr)) {\r
+ possibleOR.add(s.getObject());\r
+ }\r
+ Map<Resource,Set<Path>> matchingPaths = new HashMap<Resource, Set<Path>>();\r
+ for (Resource or : possibleOR) {\r
+ Set<Path> possiblePathsRight = new HashSet<Path>();\r
+ for (Path leftPath : pathsLeft) {\r
+ possiblePathsRight.addAll(findComparableRight(leftPath, or));\r
+ }\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
+ 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
+ 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
+ \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
+ 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 DatabaseException {\r
+ Set<Path> stepPathsLeft = new HashSet<Path>();\r
+ if (paths.size() == 0)\r
+ return;\r
+ int length = paths.iterator().next().getLength() + 1;\r
+ for (Path p : paths) {\r
+ for (Resource rel : traversed) {\r
+ stepPathsLeft.addAll(Path.expand(p,g.getStatements(p.getEnd(), rel)));\r
+ }\r
+ }\r
+ paths.clear();\r
+ for (Path p : stepPathsLeft) {\r
+ if (p.getLength() == length)\r
+ paths.add(p);\r
+ }\r
+ }\r
+ \r
+ private Collection<Path> findComparableRight(Path leftPath, Resource beginRight) throws DatabaseException {\r
+ Set<Path> rightPaths = new HashSet<Path>();\r
+ rightPaths.addAll(Path.create(g.getStatements(beginRight, getRight(leftPath.getStatements().get(0).getPredicate()))));\r
+ for (int i = 1; i < leftPath.getLength(); i++) {\r
+ if (rightPaths.size() == 0)\r
+ return rightPaths;\r
+ Set<Path> stepPaths = new HashSet<Path>();\r
+ for (Path p : rightPaths) {\r
+ stepPaths.addAll(Path.expand(p, g.getStatements(p.getEnd(), getRight(leftPath.getStatements().get(i).getPredicate()))));\r
+ }\r
+ rightPaths.clear();\r
+ for (Path p : stepPaths)\r
+ if (p.getLength() == i+1) \r
+ rightPaths.add(p);\r
+ }\r
+ return rightPaths;\r
+ \r
+ }\r
+ \r
+ private Resource getRight(Resource r) {\r
+ if (comparableResources.containsLeft(r))\r
+ return comparableResources.getRight(r);\r
+ return r;\r
+ }\r
+ \r
+\r
+ \r