[Neo] Neo4j Traverse API

Satish Varma Dandu dsvarma at gmail.com
Fri Feb 26 02:27:56 CET 2010


Hi John/nishith/Ulf,
  Thanks guys for all your replies.

John,
  I was thinking about the same thing that you suggested. I havent yet
constructed a huge n/w, but i was just curious how long will it take to
traverse for 100K nodes or 1M nodes & & comparing each nodes value

So for traversing  all nodes, is it going to be too expensive; just curious
though

  if ( userHasTextOnProfile( node, "neo4j" ) ) // for Million nodes
       {
         .....
       }


Thanks,
-Satish

On Thu, Feb 25, 2010 at 3:24 AM, Johan Svensson <johan at neotechnology.com>wrote:

> Hi,
>
> Would it be possible to just traverse the friends looking for the
> "neo4j" text on their profile? Like this:
>
>    Node user = // get the user;
>    Traverser trav = user.traverse( Order.BREADTH_FIRST,
>        new StopEvStopEvaluator.END_OF_GRAPH,
> ReturnableEvaluator.ALL_BUT_START_NODE,
>        RelTypes.FRIEND, Direction.BOTH );
>    for ( Node node : trav )
>    {
>        int currentDepth = trav.currentPosition().depth();
>        if ( currentDepth > 2 )
>        {
>            // we only check second level friends
>            break;
>        }
>        if ( userHasTextOnProfile( node, "neo4j" ) )
>        {
>            addNodeToResult( node, currentDepth );
>        }
>    }
>
>
> If that is too slow you could combine a lucene search (for fulltext
> search see
> http://wiki.neo4j.org/content/Indexing_with_IndexService#Fulltext_indexing
> )
> and a traversal like this:
>
>    Set<Node> nodeSet = new HashSet<Node>();
>    for ( Node node : index.getNodes( "profile_text", "neo4j" ) )
>    {
>        nodeSet.add( node );
>    }
>    Node user = // get the user;
>    Traverser trav = user.traverse( Order.BREADTH_FIRST,
>        StopEvaluator.END_OF_GRAPH, ReturnableEvaluator.ALL_BUT_START_NODE,
>        RelTypes.FRIEND, Direction.BOTH );
>    for ( Node node : trav )
>    {
>        int currentDepth = trav.currentPosition().depth();
>        if ( currentDepth > 2 )
>        {
>            // we only check second level friends
>            break;
>        }
>        if ( nodeSet.contains( node ) )
>        {
>            addNodeToResult( node, currentDepth );
>        }
>    }
>
>
> If there are very few hits on the lucene search it is more efficient
> to do a shortest path search using the neo4j-graph-algo component
> (0.4-SNAPSHOT):
>
>    Node user = // get the user;
>    // search using lucene and for each node do a shortest path lookup to
> user
>    for ( Node node : index.getNodes( "profile_text", "neo4j" ) )
>    {
>        List<Relationship> path = new FindSingleShortestPath( user,
>            node, RelTypes.FRIEND, 2 ).getPathAsRelationships();
>        int depth = path.size();
>        if ( depth > 0 )
>        {
>            addNodeToResult( node, depth );
>        }
>    }
>
> Regards,
> -Johan
>
> On Thu, Feb 25, 2010 at 8:32 AM, Nishith Shah <nishith at truesparrow.com>
> wrote:
> > Hi Satish,
> >
> > Can you assign the keyword that you intend to search as the property
> > of the node? For example, assign 'neo4j' as a property of the node. Of
> > course, it won't be possible if it's a free form search that you
> > intend to do. But if you can, than traversing and sorting would be so
> > much easier.
> >
> > -nishith
> >
> >
> > On Thu, Feb 25, 2010 at 12:56 PM, krum at oocs.de <krum at oocs.de> wrote:
> >> Hi Satish,
> >>
> >> if I understand you correctly, you could do the traversal in a breath
> first
> >> fashion with
> >> ... node.traverse(Order.BREATH_FIRST, ...
> >> You'll get the first degree Nodes before the second dgree nodes and so
> forth.
> >>
> >> Regards,
> >> Ulf
> >>
> >>
> >>
> >> Satish Varma Dandu <dsvarma at gmail.com> hat am 24. Februar 2010 um 19:37
> >> geschrieben:
> >>
> >>> Hi John,
> >>>
> >>>  Thanks for the reply.  Consider a scenario like LinkedIn:
> >>> 1) I wanna search for all profiles in linkedin matching "Neo4J"
> >>> 2) Now i get, lets say 20 people having Neo4J on their profiles. So far
> so
> >>> good. But i wanna order these search results based on my order. Like
> first i
> >>> wanna search results from my direct contacts followed by next order
> results.
> >>>
> >>> The worst case scenario is, once i get these search results, for each
> search
> >>> result profile, i need to traverse & find the path. But this take a lot
> of
> >>> time if i get 2 many search results. So somehow i wanna combine both
> Lucene
> >>> & traverse. Is this doable with Neo4J?
> >>>
> >>> Hope i explained the problem. Any help would be great.
> >>>
> >>> Thanks,
> >>> -Satish
> _______________________________________________
> Neo mailing list
> User at lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>


More information about the User mailing list