@Test public void testDistance() { double lon1 = 32.32; double lat1 = 32.32; Transaction tx = graphDb.beginTx(); String query; System.out.println("delete all nodes"); String deleteQuery = "MATCH n-[r]-() DELETE n, r"; graphDb.execute(deleteQuery); root = PrefixTree.getOrCreateRoot(INDEXLABEL, graphDb); Node node = graphDb.createNode(); node.setProperty(LON, lon1); node.setProperty(LAT, lat1); List<Node> candidate1 = gendata.insertNode(graphDb, 2, lon1, lat1, 0.1); List<Node> candidate2 = gendata.insertNode(graphDb, 2, lon1, lat1, 0.2); PrefixTree.addNode(graphDb, root, candidate1.get(0)); query = "MATCH (n {PrefixTreeRoot:'root'})-[*8..8]-(x {geohash: 'stz030gzmygt'}) RETURN x"; PrefixTree.addNode(graphDb, root, candidate1.get(1)); query = "MATCH (n {PrefixTreeRoot:'root'})-[*8..8]-(x {geohash: 'stz00001z0d7'}) RETURN x"; PrefixTree.addNode(graphDb, root, candidate2.get(0)); query = "MATCH (n {PrefixTreeRoot:'root'})-[*8..8]-(x {geohash: 'stz0dy31m1hs'}) RETURN x"; PrefixTree.addNode(graphDb, root, candidate2.get(1)); query = "MATCH (n {PrefixTreeRoot:'root'})-[*8..8]-(x {geohash: 'stz00s3tzsd0'}) RETURN x"; // for (Node can : candidate1) { // PrefixTree.addNode(graphDb, root, can); // query = "MATCH (n {PrefixTreeRoot:'root'})-[*8..8]-(n {geohash: ''}) RETURN x"; // getAllNodes(query, "tag"); // System.out.println("lat:" + can.getProperty("lat") + " lon:" // + can.getProperty("lon") + " geohash:" + can.getProperty("geohash") + " dis:" + // CalDistance // .calculateDistance((double) can.getProperty("lon"), (double) can.getProperty("lat"), // node) // + " value:" + can); // } // for (Node can : candidate2) { // PrefixTree.addNode(graphDb, root, can); // query = "MATCH (n {PrefixTreeRoot:'root'})-[*8..8]-(x) RETURN x"; // getAllNodes(query, "tag"); // System.out.println("lat:" + can.getProperty("lat") + " lon:" // + can.getProperty("lon") + " geohash:" + can.getProperty("geohash") + " dis:" + // CalDistance // .calculateDistance((double) can.getProperty("lon"), (double) can.getProperty("lat"), // node) // + " value:" + can); // } getWithDistance(20.0, root, node); getWithDistance(4.0, root, node); tx.close(); graphDb.shutdown(); }
@Test public void testAddNode() { List<Node> candidate = null; List<Node> child = null; Transaction tx = graphDb.beginTx(); try { root = PrefixTree.getOrCreateRoot(INDEXLABEL, graphDb); candidate = gendata.insertNode(graphDb, 1, false); PrefixTree.addNode(graphDb, root, candidate.get(0)); child = PrefixTree.getChild((String) candidate.get(0).getProperty(GEOHASH), root, 7); assertTrue(candidate.get(0).getProperty(GEOHASH) == child.get(0).getProperty(GEOHASH)); } catch (Exception e) { System.out.println(e); } finally { tx.close(); } graphDb.shutdown(); }
/** Given an input string, level, and optionally a tag length, find a matching prefix. */ private PrefixMatch findPrefixMatch( String input, TagLengthList tagLength, LevelTypeList level_type) { List<PrefixMatch> match_list = new ArrayList<PrefixMatch>(); PrefixTree<PrefixMatch> tree = prefix_tree_map.get(level_type); assert tree != null; List<PrefixMatch> list = tree.search(input); if (!list.isEmpty()) { if (tagLength == null) match_list.addAll(list); else { for (PrefixMatch match : list) if (match.getScheme().getTagLength() == tagLength) match_list.add(match); } } if (match_list.isEmpty()) throw new TDTException("No schemes or levels matched the input value"); else if (match_list.size() > 1) throw new TDTException("More than one scheme/level matched the input value"); else return match_list.get(0); }
@Test public void testDeleteNode() { Transaction tx = graphDb.beginTx(); String query = "MATCH n-[r]-() DELETE n, r"; graphDb.execute(query); query = "MATCH (n) WHERE HAS (n.geohash) DELETE n"; graphDb.execute(query); root = PrefixTree.getOrCreateRoot(INDEXLABEL, graphDb); List<Node> candidate = gendata.insertNode(graphDb, 10, true); for (Node node : candidate) { PrefixTree.addNode(graphDb, root, node); } List<Node> child = PrefixTree.getChild((String) candidate.get(0).getProperty(GEOHASH), root, 7); assertTrue(candidate.get(0).getProperty(GEOHASH) == child.get(0).getProperty(GEOHASH)); PrefixTree.deleteNode(candidate.get(0)); child = PrefixTree.getChild((String) candidate.get(0).getProperty(GEOHASH), root, 7); assertEquals(child.size(), 0); tx.close(); graphDb.shutdown(); }
/** initialise various indices */ private void initFromTDT(EpcTagDataTranslation tdt) { Scheme[] scheme = tdt.getScheme(); for (Scheme ss : scheme) { // create an index so that we can find a scheme based on tag length for (Level level : ss.getLevel()) { String s = level.getPrefixMatch(); if (s != null) { // insert into prefix tree according to level type. PrefixTree<PrefixMatch> prefix_tree = prefix_tree_map.get(level.getType()); if (prefix_tree == null) { prefix_tree = new PrefixTree<PrefixMatch>(); prefix_tree_map.put(level.getType(), prefix_tree); } prefix_tree.insert(s, new PrefixMatch(ss, level)); } } } }
@Test public void testUpdateNode() { double lon = -139.12; double lat = -45.24; Transaction tx = graphDb.beginTx(); String query = "MATCH n-[r]-() DELETE n, r"; graphDb.execute(query); query = "MATCH (n) WHERE HAS (n.geohash) DELETE n"; graphDb.execute(query); root = PrefixTree.getOrCreateRoot(INDEXLABEL, graphDb); List<Node> candidate = gendata.insertNode(graphDb, 10, true); for (Node node : candidate) { PrefixTree.addNode(graphDb, root, node); } String geoHashPre = (String) candidate.get(0).getProperty(GEOHASH); String geoHashCur = GeoHash.getHash(lon, lat); List<Node> child = PrefixTree.getChild(geoHashPre, root, 7); assertEquals(child.size(), 1); PrefixTree.updateNode(graphDb, root, candidate.get(0), lon, lat); child = PrefixTree.getChild(geoHashPre, root, 7); assertEquals(child.size(), 0); child = PrefixTree.getChild(geoHashCur, root, 7); assertEquals(child.size(), 1); tx.close(); graphDb.shutdown(); }
public void getWithDistance(double distance, Node root, Node node) { System.out.println("test distance"); Iterator<Node> neighbors = PrefixTree.withinDistance(root, node, distance).iterator(); print(neighbors, node); }