Note: the problem I am trying to solve is from horse racing. I cannot currently solve that problem because I do not have the information in a database. This is an analogous problem where the could easily be placed in the database.
/** * 10. Start at the node representing the length of the word * 20. Create a relationship from theLengthNode to a wordNode * 30. Iterate the characters in the multiset * 32. Create a pattern node representing current character and * add a property constraint that it must match the current character * 34. Add a relationship between the character pattern node and word node * 40. Get the matcher * 50. Get the iterator and iterate */ public void findAnagramUsingPatternMatching(){ // 10. length node should represent 4 and can be only one node // so we associate it with that node final PatternNode theLengthNode = new PatternNode(); theLengthNode.setAssociation(lengthNode); // 20. wordNode could be any node with the correct properties final PatternNode wordNode = new PatternNode(); theLengthNode.createRelationshipTo(wordNode, RelTypes.HAS_LENGTH); // 30. Iterate the characters in the multiset for (final Character c : multiset){ // 32. Create a pattern node representing current character and // add a property constraint that it must match the current character PatternNode characterPatternNode = new PatternNode(); characterPatternNode.addPropertyConstraint( "letter", CommonValueMatchers.exact( c ) ); // 34. Add a relationship between the character pattern node and word node PatternRelationship localPatternRelationship = wordNode.createRelationshipTo(characterPatternNode, RelTypes.HAS_LETTER); localPatternRelationship.addPropertyConstraint("occurrences", new ValueMatcher(){ public boolean matches(Object value){ boolean result = (int)value == multiset.count(c); return result; } }); } // 40. Get the matcher PatternMatcher pm = PatternMatcher.getMatcher(); // 50. Get the iterator and iterate final Iterablematches = pm.match(theLengthNode, lengthNode); Iterator iter = matches.iterator(); while(iter.hasNext()){ PatternMatch match = iter.next(); Node matchNode = match.getNodeFor(wordNode); System.out.println("matches from PM: " + matchNode.getProperty("word") ); } }
No comments:
Post a Comment