@Test
  public void testAddProperty() {
    String key3 = "key3";

    Node node1 = getGraphDb().getNodeById(node1Id);
    Node node2 = getGraphDb().getNodeById(node2Id);
    Relationship rel = node1.getSingleRelationship(MyRelTypes.TEST, Direction.BOTH);
    // add new property
    node2.setProperty(key3, int1);
    rel.setProperty(key3, int2);
    assertTrue(node1.hasProperty(key1));
    assertTrue(node2.hasProperty(key1));
    assertTrue(node1.hasProperty(key2));
    assertTrue(node2.hasProperty(key2));
    assertTrue(node1.hasProperty(arrayKey));
    assertTrue(node2.hasProperty(arrayKey));
    assertTrue(rel.hasProperty(arrayKey));
    assertTrue(!node1.hasProperty(key3));
    assertTrue(node2.hasProperty(key3));
    assertEquals(int1, node1.getProperty(key1));
    assertEquals(int2, node2.getProperty(key1));
    assertEquals(string1, node1.getProperty(key2));
    assertEquals(string2, node2.getProperty(key2));
    assertEquals(int1, rel.getProperty(key1));
    assertEquals(string1, rel.getProperty(key2));
    assertEquals(int2, rel.getProperty(key3));
  }
 @Test
 public void testRelMultiRemoveProperty() {
   Node node1 = getGraphDb().createNode();
   Node node2 = getGraphDb().createNode();
   Relationship rel = node1.createRelationshipTo(node2, MyRelTypes.TEST);
   rel.setProperty("key0", "0");
   rel.setProperty("key1", "1");
   rel.setProperty("key2", "2");
   rel.setProperty("key3", "3");
   rel.setProperty("key4", "4");
   newTransaction();
   rel.removeProperty("key3");
   rel.removeProperty("key2");
   rel.removeProperty("key3");
   newTransaction();
   getNodeManager().clearCache();
   assertEquals("0", rel.getProperty("key0"));
   assertEquals("1", rel.getProperty("key1"));
   assertEquals("4", rel.getProperty("key4"));
   assertTrue(!rel.hasProperty("key2"));
   assertTrue(!rel.hasProperty("key3"));
   rel.delete();
   node1.delete();
   node2.delete();
 }
Example #3
0
  @Test
  public void testRelationshipAddProperty() {
    Node node1 = getGraphDb().createNode();
    Node node2 = getGraphDb().createNode();
    Relationship rel1 = node1.createRelationshipTo(node2, MyRelTypes.TEST);
    Relationship rel2 = node2.createRelationshipTo(node1, MyRelTypes.TEST);
    try {
      rel1.setProperty(null, null);
      fail("Null argument should result in exception.");
    } catch (IllegalArgumentException e) {
    }
    Integer int1 = new Integer(1);
    Integer int2 = new Integer(2);
    String string1 = new String("1");
    String string2 = new String("2");

    // add property
    rel1.setProperty(key1, int1);
    rel2.setProperty(key1, string1);
    rel1.setProperty(key2, string2);
    rel2.setProperty(key2, int2);
    assertTrue(rel1.hasProperty(key1));
    assertTrue(rel2.hasProperty(key1));
    assertTrue(rel1.hasProperty(key2));
    assertTrue(rel2.hasProperty(key2));
    assertTrue(!rel1.hasProperty(key3));
    assertTrue(!rel2.hasProperty(key3));
    assertEquals(int1, rel1.getProperty(key1));
    assertEquals(string1, rel2.getProperty(key1));
    assertEquals(string2, rel1.getProperty(key2));
    assertEquals(int2, rel2.getProperty(key2));

    getTransaction().failure();
  }
Example #4
0
  @Test
  public void testRelationshipChangeProperty2() {
    Integer int1 = new Integer(1);
    Integer int2 = new Integer(2);
    String string1 = new String("1");
    String string2 = new String("2");
    Boolean bool1 = new Boolean(true);
    Boolean bool2 = new Boolean(false);

    Node node1 = getGraphDb().createNode();
    Node node2 = getGraphDb().createNode();
    Relationship rel1 = node1.createRelationshipTo(node2, MyRelTypes.TEST);
    rel1.setProperty(key1, int1);
    rel1.setProperty(key1, int2);
    assertEquals(int2, rel1.getProperty(key1));
    rel1.removeProperty(key1);
    rel1.setProperty(key1, string1);
    rel1.setProperty(key1, string2);
    assertEquals(string2, rel1.getProperty(key1));
    rel1.removeProperty(key1);
    rel1.setProperty(key1, bool1);
    rel1.setProperty(key1, bool2);
    assertEquals(bool2, rel1.getProperty(key1));
    rel1.removeProperty(key1);

    rel1.delete();
    node2.delete();
    node1.delete();
  }
 @Test
 public void testGetOrCreateRelationship() throws Exception {
   final Transaction tx = gdb.beginTx();
   final Node david = graphDatabase.createNode(map("name", "David"));
   final Node michael = graphDatabase.createNode(map("name", "Michael"));
   final Relationship rel1 =
       graphDatabase.getOrCreateRelationship(
           "knows",
           "whom",
           "david_michael",
           david,
           michael,
           "KNOWS",
           map("whom", "david_michael"));
   final Relationship rel2 =
       graphDatabase.getOrCreateRelationship(
           "knows",
           "whom",
           "david_michael",
           david,
           michael,
           "KNOWS",
           map("whom", "david_michael"));
   assertEquals("david_michael", rel1.getProperty("whom"));
   assertEquals("KNOWS", rel1.getType().name());
   assertEquals(david, rel1.getStartNode());
   assertEquals(michael, rel1.getEndNode());
   assertEquals(rel1, rel2);
   assertEquals(
       rel1, gdb.index().forRelationships("knows").get("whom", "david_michael").getSingle());
   tx.success();
   tx.finish();
 }
Example #6
0
 @Test
 public void testChangeProperty() {
   Node node1 = getGraphDb().createNode();
   Node node2 = getGraphDb().createNode();
   Relationship rel = node1.createRelationshipTo(node2, MyRelTypes.TEST);
   rel.setProperty("test", "test1");
   newTransaction();
   rel.setProperty("test", "test2");
   rel.removeProperty("test");
   rel.setProperty("test", "test3");
   assertEquals("test3", rel.getProperty("test"));
   rel.removeProperty("test");
   rel.setProperty("test", "test4");
   newTransaction();
   assertEquals("test4", rel.getProperty("test"));
 }
Example #7
0
 public Representation getRelationshipProperty(long relationshipId, String key)
     throws NoSuchPropertyException, RelationshipNotFoundException {
   Relationship relationship = relationship(relationshipId);
   try {
     return PropertiesRepresentation.value(relationship.getProperty(key));
   } catch (NotFoundException e) {
     throw new NoSuchPropertyException(relationship, key);
   }
 }
 @Test
 @Transactional
 public void shouldCreateRelationshipWithProperty() throws Exception {
   Relationship relationship =
       neo4jTemplate.createRelationshipBetween(referenceNode, node1, "has", map("name", "rel2"));
   assertNotNull(relationship);
   assertEquals(referenceNode, relationship.getStartNode());
   assertEquals(node1, relationship.getEndNode());
   assertEquals(HAS.name(), relationship.getType().name());
   assertEquals("rel2", relationship.getProperty("name", "not set"));
 }
 @Test
 public void listing3_9_add_properties_to_relationships() {
   usersAndMovies.addPropertiesToRelationships();
   try (Transaction tx = graphDb.beginTx()) {
     Relationship hasSeen =
         usersAndMovies.user1.getSingleRelationship(
             MyRelationshipTypes.HAS_SEEN, Direction.OUTGOING);
     assertEquals(5, hasSeen.getProperty("stars"));
     tx.success();
   }
 }
  // ----- protected methods -----
  protected boolean hasPropertyValue(
      Relationship rel, PropertyKey propertyKey, Object propertyValue) {

    if (rel != null && rel.hasProperty(propertyKey.dbName())) {

      Object value = rel.getProperty(propertyKey.dbName());
      return value.equals(propertyValue);
    }

    return false;
  }
 @Test
 public void testAddCacheCleared() {
   Node nodeA = getGraphDb().createNode();
   nodeA.setProperty("1", 1);
   Node nodeB = getGraphDb().createNode();
   Relationship rel = nodeA.createRelationshipTo(nodeB, MyRelTypes.TEST);
   rel.setProperty("1", 1);
   getTransaction().success();
   getTransaction().finish();
   newTransaction();
   NodeManager nodeManager =
       ((EmbeddedGraphDatabase) getGraphDb()).getConfig().getGraphDbModule().getNodeManager();
   nodeManager.clearCache();
   nodeA.createRelationshipTo(nodeB, MyRelTypes.TEST);
   int count = 0;
   for (Relationship relToB : nodeA.getRelationships(MyRelTypes.TEST)) {
     count++;
   }
   assertEquals(2, count);
   nodeA.setProperty("2", 2);
   assertEquals(1, nodeA.getProperty("1"));
   rel.setProperty("2", 2);
   assertEquals(1, rel.getProperty("1"));
   nodeManager.clearCache();
   // trigger empty load
   getGraphDb().getNodeById(nodeA.getId());
   getGraphDb().getRelationshipById(rel.getId());
   // apply COW maps
   getTransaction().success();
   getTransaction().finish();
   newTransaction();
   count = 0;
   for (Relationship relToB : nodeA.getRelationships(MyRelTypes.TEST)) {
     count++;
   }
   assertEquals(2, count);
   assertEquals(1, nodeA.getProperty("1"));
   assertEquals(1, rel.getProperty("1"));
   assertEquals(2, nodeA.getProperty("2"));
   assertEquals(2, rel.getProperty("2"));
 }
Example #12
0
  public Map<String, Object> _getProperties(Relationship relationship) {
    Iterable<String> keys = relationship.getPropertyKeys();
    Map<String, Object> pars = null;

    for (String key : keys) {
      if (null == pars) pars = new HashMap<String, Object>();

      pars.put(key, relationship.getProperty(key));
    }

    return pars;
  }
  @Override
  public PropertyMap getProperties() throws FrameworkException {

    Map<String, Object> properties = new LinkedHashMap<>();

    for (String key : dbRelationship.getPropertyKeys()) {

      properties.put(key, dbRelationship.getProperty(key));
    }

    // convert the database properties back to their java types
    return PropertyMap.databaseTypeToJavaType(securityContext, this, properties);
  }
Example #14
0
  @Test
  public void testRelGetProperties() {
    Integer int1 = new Integer(1);
    Integer int2 = new Integer(2);
    String string = new String("3");

    Node node1 = getGraphDb().createNode();
    Node node2 = getGraphDb().createNode();
    Relationship rel1 = node1.createRelationshipTo(node2, MyRelTypes.TEST);
    try {
      rel1.getProperty(key1);
      fail("get non existing property din't throw exception");
    } catch (NotFoundException e) {
    }
    try {
      rel1.getProperty(null);
      fail("get of null key din't throw exception");
    } catch (IllegalArgumentException e) {
    }
    assertTrue(!rel1.hasProperty(key1));
    assertTrue(!rel1.hasProperty(null));
    rel1.setProperty(key1, int1);
    rel1.setProperty(key2, int2);
    rel1.setProperty(key3, string);
    assertTrue(rel1.hasProperty(key1));
    assertTrue(rel1.hasProperty(key2));
    assertTrue(rel1.hasProperty(key3));
    try {
      rel1.removeProperty(key3);
    } catch (NotFoundException e) {
      fail("Remove of property failed.");
    }
    assertTrue(!rel1.hasProperty(key3));
    assertTrue(!rel1.hasProperty(null));
    rel1.delete();
    node2.delete();
    node1.delete();
  }
Example #15
0
 public Map<String, Object> getRelationshipProperties(long relationshipId)
     throws DatabaseBlockedException {
   Transaction tx = database.graph.beginTx();
   try {
     Relationship relationship = database.graph.getRelationshipById(relationshipId);
     Map<String, Object> allProperties = new HashMap<String, Object>();
     for (String propertyKey : relationship.getPropertyKeys()) {
       allProperties.put(propertyKey, relationship.getProperty(propertyKey));
     }
     tx.success();
     return allProperties;
   } finally {
     tx.finish();
   }
 }
  @Test
  public void testSameTxWithArray() {
    getTransaction().success();
    getTransaction().finish();
    newTransaction();

    Node nodeA = getGraphDb().createNode();
    Node nodeB = getGraphDb().createNode();
    Relationship relA = nodeA.createRelationshipTo(nodeB, MyRelTypes.TEST);
    nodeA.setProperty(arrayKey, array);
    relA.setProperty(arrayKey, array);
    NodeManager nodeManager =
        ((EmbeddedGraphDatabase) getGraphDb()).getConfig().getGraphDbModule().getNodeManager();
    nodeManager.clearCache();
    assertTrue(nodeA.getProperty(arrayKey) != null);
    assertTrue(relA.getProperty(arrayKey) != null);
    relA.delete();
    nodeA.delete();
    nodeB.delete();
  }
Example #17
0
  @Test
  public void simple_persistent_storage() throws Exception {
    long firstNodeId = createDb();

    GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);

    try {
      Node firstNode = graphDb.getNodeById(firstNodeId);

      Relationship relationship = firstNode.getSingleRelationship(KNOWS, Direction.OUTGOING);
      Node secondNode = relationship.getEndNode();

      out.println("I just loaded this from the data store:");
      out.println(firstNode.getProperty("message"));
      out.println(firstNode.getProperty("someJson"));
      out.println(relationship.getProperty("message"));
      out.println(secondNode.getProperty("message"));
    } finally {
      graphDb.shutdown();
    }
  }
  @Test
  public void shouldStoreSuppliedPropertiesWhenCreatingRelationship() throws Exception {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put("string", "value");
    properties.put("integer", 17);
    long relId =
        actions
            .createRelationship(
                graphdbHelper.createNode(), graphdbHelper.createNode(), "LOVES", properties)
            .getId();

    Transaction tx = database.getGraph().beginTx();
    try {
      Relationship rel = database.getGraph().getRelationshipById(relId);
      for (String key : rel.getPropertyKeys()) {
        assertTrue("extra property stored", properties.containsKey(key));
      }
      for (Map.Entry<String, Object> entry : properties.entrySet()) {
        assertEquals(entry.getValue(), rel.getProperty(entry.getKey()));
      }
    } finally {
      tx.finish();
    }
  }
  // example path:
  // (start)--[WALK1,1190]-->(hub)--[HUBBUS1,49581]-->(hub)--[53.36179430400081-6.299620132568407,1224]-->(end)
  public DirectionsList convertOneBusPath(WeightedPath path, double time) {
    int count = 0;
    double cost = 0;
    double deptTime = 0;

    List<Node> busList = new ArrayList<Node>();

    for (Relationship relationship : path.relationships()) {
      if (count == 0) // lat1lon1
      {
        double distanceInKm = (Double) relationship.getProperty(Connection.DISTANCE);
        double distanceInMins = Math.round(20 * distanceInKm * 1e2) / 1e2;
        walks.add(new DirectionsWalk(distanceInMins, relationship.getStartNode(), relationship));
        Node stop =
            stopLayer.get(Stop.STOPID, (String) relationship.getProperty(Stop.STOPID)).getSingle();
        busList.add(stop);
        deptTime = (Double) relationship.getProperty(Connection.TIME);
        cost += (Double) stop.getProperty(Stop.TIMETOHUB);
      }
      if (count == 1) // hubbus1
      {
        cost += (Double) relationship.getProperty(Connection.COST);
      }
      if (count == 2) // lat2lon2
      {
        Node stop =
            stopLayer.get(Stop.STOPID, (String) relationship.getProperty(Stop.STOPID)).getSingle();
        cost += (Double) stop.getProperty(Stop.TIMEFROMHUB);
        busList.add(stop);
        routes.add(new DirectionsRoute(deptTime, cost, busList));
        double distanceInKm = (Double) relationship.getProperty(Connection.DISTANCE);
        double distanceInMins = Math.round(20 * distanceInKm * 1e2) / 1e2;
        walks.add(new DirectionsWalk(distanceInMins, relationship, relationship.getEndNode()));
      }
      count++;
    }

    directionsList.add(new Directions(routes, walks)); // Add Total cost
    return directionsList;
  }
Example #20
0
 /**
  * Returns the actual key value which the key ({@link #getKey()}) can be derived from, f.ex. a
  * String.
  *
  * @return the actual key value.
  */
 public Object getKeyValue() {
   return entryRelationship.getProperty(KEY_VALUE, null);
 }
Example #21
0
 /**
  * Returns the value for this entry. This is the value added via {@link BTree#addEntry(long,
  * Object)}.
  *
  * @return the value for this entry.
  */
 public Object getValue() {
   return entryRelationship.getProperty(VALUE);
 }
  // example path:
  // (start)--[WALK1,25037]-->(hub)--[HUBBUS1,44652]-->(hub)--[TRANSFER,44624]-->(hubtransfer)--[WALK2,61370]-->(hubtransfer)--[O0033,48991]-->(hub)--[HUBBUS1,49028]-->(hub)--[53.373665-6.251902,25283]-->(end)
  public DirectionsList convertTwoBusPath(WeightedPath path, double time) {
    int count = 0;
    double cost = 0;
    double deptTime = 0;

    List<Node> busList1 = new ArrayList<Node>();
    List<Node> busList2 = new ArrayList<Node>();

    for (Relationship relationship : path.relationships()) {
      if (count == 0) // lat1lon1
      {
        double distanceInKm = (Double) relationship.getProperty(Connection.DISTANCE);
        double distanceInMins = Math.round(20 * distanceInKm * 1e2) / 1e2;
        walks.add(new DirectionsWalk(distanceInMins, relationship.getStartNode(), relationship));

        Node stop =
            stopLayer.get(Stop.STOPID, (String) relationship.getProperty(Stop.STOPID)).getSingle();
        busList1.add(stop);
        deptTime = (Double) relationship.getProperty(Connection.TIME);
        cost += (Double) stop.getProperty(Stop.TIMETOHUB);
      }
      if (count == 1) // hubbus1
      {
        cost += (Double) relationship.getProperty(Connection.COST);
        busList1.add(relationship.getEndNode());
        routes.add(new DirectionsRoute(deptTime, cost, busList1));
      }

      if (count == 3) // walk2
      {
        double distanceInMins = (Double) relationship.getProperty(Connection.COST);
        cost += distanceInMins;
        walks.add(
            new DirectionsWalk(
                distanceInMins, relationship.getStartNode(), relationship.getEndNode()));
      }
      if (count == 5) // hubbus1
      {
        busList2.add(relationship.getStartNode());
        double[] transferTimes = (double[]) relationship.getStartNode().getProperty(Hub.DEPTTIMES);
        int insertionPoint = Arrays.binarySearch(transferTimes, (deptTime + cost));
        insertionPoint =
            (insertionPoint < 0)
                ? ((insertionPoint * -1) - 1)
                : insertionPoint; // ( -( insertion point ) - 1)
        if (insertionPoint != transferTimes.length) deptTime = transferTimes[insertionPoint];
        cost = 0.0;
        cost += (Double) relationship.getProperty(Connection.COST);
      }
      if (count == 6) // lat2lon2
      {
        Node stop =
            stopLayer.get(Stop.STOPID, (String) relationship.getProperty(Stop.STOPID)).getSingle();
        cost += (Double) stop.getProperty(Stop.TIMEFROMHUB);
        busList2.add(stop);
        routes.add(new DirectionsRoute(deptTime, cost, busList2));
        double distanceInKm = (Double) relationship.getProperty(Connection.DISTANCE);
        double distanceInMins = Math.round(20 * distanceInKm * 1e2) / 1e2;
        walks.add(new DirectionsWalk(distanceInMins, relationship, relationship.getEndNode()));
      }
      count++;
    }
    directionsList.add(new Directions(routes, walks));
    return directionsList;
  }
 @Override
 public String convert(Relationship value, Class<String> type) {
   return (String) value.getProperty("name");
 }
 @Test
 public void testGetDirectedRelationship() {
   Node node1 = getGraphDb().getNodeById(node1Id);
   Relationship rel = node1.getSingleRelationship(MyRelTypes.TEST, Direction.OUTGOING);
   assertEquals(int1, rel.getProperty(key1));
 }
 public Double getCost(Relationship relationship, Direction direction) {
   return (Double) relationship.getProperty(costpropertyName);
 }
Example #26
0
 /**
  * Returns the key for this entry, the key added via {@link BTree#addEntry(long, Object)}.
  *
  * @return the key for this entry.
  */
 public long getKey() {
   return (Long) entryRelationship.getProperty(KEY);
 }
  /** Compare the specified source property of the two provided relationships. */
  @Override
  public int compare(Relationship rel1, Relationship rel2) {

    Object v1 = null;
    Object v2 = null;
    if (rel1.hasProperty("source") == false || rel2.hasProperty("source") == false) {

      if (VERBOSE) {
        System.out.println("Ack!!! A relationship has no source!");
        System.out.println(
            "rel1 source = "
                + rel1.getProperty("source")
                + "; rel2 source = "
                + rel2.getProperty("source"));
      }

      return 0;
    }

    IndexHits<Node> h1 = metadataNodeIndex.get("source", rel1.getProperty("source"));
    IndexHits<Node> h2 = metadataNodeIndex.get("source", rel2.getProperty("source"));
    if (h1.size() == 0 || h2.size() == 0) {

      if (VERBOSE) {
        System.out.println("Dorf!!! A relationship has no metaDataNode!");
        System.out.println(
            "rel1 MDN = "
                + metadataNodeIndex.get("source", rel1.getProperty("source"))
                + "; rel2 MDN = "
                + metadataNodeIndex.get("source", rel1.getProperty("source")));
      }

      return 0;
    }
    Node m1 = h1.next();
    Node m2 = h2.next();

    h1.close();
    h2.close();
    if (m1.hasProperty(property.propertyName)) {
      v1 = m1.getProperty(property.propertyName);
    }
    if (m2.hasProperty(property.propertyName)) {
      v2 = m2.getProperty(property.propertyName);
    }

    if (v1 == null && v2 == null) {
      return 0;
    } else if (v2 == NOTRANKED) {
      return -1;
    } else if (v1 == NOTRANKED) {
      return 1;
    }

    Integer rank1 = NOTRANKED;
    Integer rank2 = NOTRANKED;

    if (property.type == String.class) {
      if (priorityMapString.containsKey(v1)) {
        rank1 = priorityMapString.get(v1);
      }
      if (priorityMapString.containsKey(v2)) {
        rank2 = priorityMapString.get(v2);
      }
    } else if (property.type == Long.class || property.type == Integer.class) {
      if (priorityMapString.containsKey(v1)) {
        rank1 = priorityMapLong.get(v1);
      }
      if (priorityMapString.containsKey(v2)) {
        rank2 = priorityMapLong.get(v2);
      }
    } else if (property.type == Double.class) {
      if (priorityMapString.containsKey(v1)) {
        rank1 = priorityMapDouble.get(v1);
      }
      if (priorityMapString.containsKey(v2)) {
        rank2 = priorityMapDouble.get(v2);
      }
    } else {
      throw new java.lang.UnsupportedOperationException(
          "the source property datatype " + String.valueOf(property.type) + " is unrecognized");
    }

    Integer retval = null;
    if (rank1 == NOTRANKED && rank2 == NOTRANKED) {
      retval = 0;

      if (VERBOSE) {
        System.out.println("Glarg!!! Both relationships are unranked");
      }

    } else if (rank2 == NOTRANKED) {
      retval = -1;
      nRankableRelsCompared++;

      if (VERBOSE) {
        System.out.println(
            "rel 2 (relid "
                + rel2.getId()
                + "; source "
                + rel2.getProperty("source")
                + ") property "
                + v2
                + " is not in priority list; preferring rel 1 (relid "
                + rel1.getId()
                + "; source "
                + rel1.getProperty("source")
                + ") property "
                + v1
                + ")");
      }
    } else if (rank1 == NOTRANKED) {
      retval = 1;
      nRankableRelsCompared++;

      if (VERBOSE) {
        System.out.println(
            "rel 1 (relid "
                + rel1.getId()
                + "; name "
                + rel1.getProperty("source")
                + ") property "
                + v1
                + " is not in priority list; preferring rel 2 (relid "
                + rel2.getId()
                + "; source "
                + rel2.getProperty("source")
                + ") property "
                + v2
                + ")");
      }
    } else {
      retval = rank1.compareTo(rank2);
      nRankableRelsCompared += 2;

      if (VERBOSE) {
        System.out.println(
            "rel 1 (relid "
                + rel1.getId()
                + "; name "
                + rel1.getProperty("source")
                + ") property "
                + v1
                + " || rel 2 (relid "
                + rel2.getId()
                + "; source "
                + rel2.getProperty("source")
                + ") property "
                + v2
                + ")");
        System.out.println("\t" + retval);
      }
    }

    // priority is indicated by proximity to the beginning of the list, so we sort in REVERSE!
    // return retval * -1;
    return retval;
  }