+ }\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
+ 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 ol : objectLeft.getKeys()) {\r
+ // all statements to the left side object\r
+ List<Statement> left = objectLeft.getValues(ol);\r
+ // all subjects that have statements to the left side object (ol)\r
+ Set<Resource> sLeft = new HashSet<Resource>();\r
+ // all matching subjects on the right side\r
+ Set<Resource> sRight = new HashSet<Resource>();\r
+ for (Statement s : left) {\r
+ sLeft.add(s.getSubject());\r
+ sRight.add(comparableResources.getRight(s.getSubject()));\r
+ }\r
+ \r
+ // check if object left can be reliably identified by available statements\r
+ // if there are any objects on the left side with similar statements, object left cannot be mapped.\r
+ boolean hasSimilar = false;\r
+ MapList<Resource, Statement> comparableOLeft = new MapList<Resource, Statement>();\r
+ for (Resource sl : sLeft) {\r
+ for (Statement s : subjectLeft.getValues(sl)) {\r
+ if (!s.getObject().equals(ol)) {\r
+ comparableOLeft.add(s.getObject(),s);\r
+ }\r
+ }\r
+ }\r
+ \r
+ for (Resource similarOl : comparableOLeft.getKeys()) {\r
+ List<Statement> similarLeft = comparableOLeft.getValues(similarOl);\r
+ if (similarLeft.size() == left.size()) {\r
+ boolean useL[] = new boolean[left.size()];\r
+ boolean useSL[] = new boolean[left.size()];\r
+ for (int i = 0; i < left.size(); i++) {\r
+ useL[i] = false;\r
+ useSL[i] = false;\r
+ }\r
+ for (int i = 0; i < left.size(); i++) {\r
+ for (int j = 0; j < left.size(); j++) {\r
+ if (useSL[j])\r
+ continue;\r
+ Resource pl = left.get(i).getPredicate();\r
+ Resource psl = similarLeft.get(j).getPredicate();\r
+ if (pl.equals(psl)) {\r
+ useL[i] = true;\r
+ useSL[j] = true;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ boolean diff = false;\r
+ for (int i = 0; i < left.size(); i++) {\r
+ if (!useL[i] || !useSL[i]) {\r
+ diff = true;\r
+ }\r
+ }\r
+ if (!diff) {\r
+ hasSimilar = true;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ \r
+ if (hasSimilar)\r
+ continue;\r
+ \r
+ \r
+ // all objects that subjects on the right side point to. Object left has its matching resource among these, if it has matching resource\r
+ MapList<Resource,Statement> possibleOR = new MapList<Resource, Statement>();\r
+ for (Resource sr : sRight) {\r
+ for (Statement s : subjectRight.getValues(sr))\r
+ possibleOR.add(s.getObject(),s);\r
+ }\r
+ \r
+ // filter possible right side objects to those that have same amount of statements as the left side object\r
+ for (Resource or : possibleOR.getKeys().toArray(new Resource[possibleOR.getKeys().size()])) {\r
+ List<Statement> right = possibleOR.getValues(or);\r
+ if (right.size() != left.size())\r
+ possibleOR.remove(or);\r
+ \r
+ }\r
+ \r
+ // check for matching statements (comparable subjects, matching predicates)\r
+ MapList<Resource,Statement> matchingOR = new MapList<Resource, Statement>(); // list of objects that have matching statements\r
+ Map<Resource,Pair<int[], int[]>> matchingStatements = new HashMap<Resource, Pair<int[], int[]>>(); // matching statements\r
+ for (Resource or : possibleOR.getKeys()) {\r
+ List<Statement> right = possibleOR.getValues(or);\r
+ int iLeft[] = new int[left.size()];\r
+ int iRight[] = new int[right.size()];\r
+ \r
+ for (int i = 0; i < left.size(); i++) {\r
+ iLeft[i] = -1;\r
+ iRight[i] = -1;\r
+ }\r
+ \r
+ for (int l = 0; l < left.size(); l++) {\r
+ Statement ls = left.get(l);\r
+ for (int r = 0; r < right.size(); r++) {\r
+ if (iRight[r] >= 0)\r
+ continue;\r
+ Statement rs = right.get(r);\r
+ if (!comparableResources.contains(ls.getSubject(), rs.getSubject()))\r
+ continue;\r
+ if (rcomp.compare(ls.getPredicate(),rs.getPredicate()) == 0) {\r
+ iLeft[l] = r;\r
+ iRight[r] = l;\r
+ break;\r
+ }\r
+ }\r
+ \r
+ }\r
+ boolean success = true;\r
+ for (int i = 0; i < left.size(); i++) {\r
+ if (iLeft[i] < 0) {\r
+ success = false;\r
+ break;\r
+ }\r
+ if (iRight[i] < 0) {\r
+ success = false;\r
+ break;\r
+ }\r
+ \r
+ }\r
+ if (success) {\r
+ for (Statement s : right) \r
+ matchingOR.add(or,s);\r
+ matchingStatements.put(or, new Pair<int[], int[]>(iLeft, iRight));\r
+ }\r
+ }\r
+ // if there is only one matching right side object, we have found a match \r
+ if (matchingOR.getKeySize() == 1) {\r
+ Resource or = matchingOR.getKeys().iterator().next();\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
+ for (int l = 0; l < left.size(); l++) {\r
+ int r = indices.first[l];\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
+\r
+ }\r
+ \r
+ \r
+ }\r
+ \r
+ private void processUnreliableDeep(Set<Statement> unreliableLeft, Set<Statement> unreliableRight, Stack<Resource> objectsLeft, Stack<Resource> objectsRight) throws ManyObjectsForFunctionalRelationException, ServiceException {\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 (possiblePathsRight.size() == pathsLeft.size()) {\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
+ objectsLeft.add(ol);\r
+ objectsRight.add(or);\r
+ comparableResources.map(ol, or);\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
+ }\r
+ }\r
+ \r
+ }\r
+ \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;\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 ManyObjectsForFunctionalRelationException, ServiceException {\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