As a side note, my plan is to create a GraphDataBag that implements the
Graph interface, but stores the triples internally in a
DistinctDataBag<Triple>.  This would then be used instead of an in-memory
Graph when we know we don't need to add triples after the query is finished
and don't need indexes (Fuseki for example).

-Stephen


> -----Original Message-----
> From: Stephen Allen [mailto:[email protected]]
> Sent: Tuesday, September 27, 2011 4:14 PM
> To: [email protected]
> Subject: Comparators for Triple or Node?
> 
> All,
> 
> I am working on removing memory limits for CONSTRUCT queries.  Since
> the
> spec requires that the triples created by the graph template be
> combined by
> a set union [1] (section 16.2 in the 1.1 WD), it means we need to
> remove
> duplicates.  As the triples do not need to be ordered (section 16.2.3),
> it
> seems like DistinctDataBag<Triple> will fit the bill as a temporary
> storage
> container/duplicate remover.
> 
> The current implementation of DistinctDataBag is implemented as an in-
> memory
> HashMap that spills sorted data to disk.  When the data is read back
> using a
> merge-sort, all duplicates will be adjacent, and can thus be easily
> removed.
> 
> Anyway, to make a long story short, I need a Comparator<Triple> to pass
> to
> the DistinctDataBag.  Do we have such a thing?  If not, what is the
> best way
> to implement this?  I have an attempt below, but I need some help on
> the
> NodeComparator class.
> 
> -Stephen
> 
> [1] It would be nice if it was a bag union and we had something like
> CONSTRUCT DISTINCT for set.  I'm guessing it is not possible to change
> the
> spec for backwards compatibility reasons with SPARQL 1.0?
> 
> ==
> 
> public class TripleComparator implements Comparator<Triple>
> {
>     private final NodeComparator nc = new NodeComparator();
> 
>     public int compare(Triple o1, Triple o2)
>     {
>         int toReturn = nc.compare(o1.getSubject(), o2.getSubject());
>         if (toReturn == 0)
>         {
>             toReturn = nc.compare(o1.getPredicate(),
> o2.getPredicate());
>             if (toReturn == 0)
>             {
>                 toReturn = nc.compare(o1.getObject(), o2.getObject());
>             }
>         }
> 
>         return toReturn;
>     }
> }
> 
> 
> public class NodeComparator implements Comparator<Node>
> {
>     public int compare(Node o1, Node o2)
>     {
>         // TODO: What should I be doing here?
>         return
> o1.getIndexingValue().toString().compareTo(o2.getIndexingValue().toStri
> ng())
> ;
>     }
> }


Reply via email to