Based on "The Neo4j v2.3.0-M01 Manual" manual under "7.1. How to use the 
REST API from Java"
I have tried to develop a similar code and using the latest Jersey library 
to date is 2.18.

Authentication would take place the following code snippet,

    private static WebTarget testDatabaseAuthentication()
    {
        // START SNIPPET: testAuthentication
        Client client = ClientBuilder.newClient();

       HttpAuthenticationFeature authFeature = HttpAuthenticationFeature.
basic(username, password);
        client.register(authFeature);

       WebTarget target = client.target(SERVER_ROOT_URI);
        
        Response response = target
                .request()
                .header("application/xml", "true")
                .get();
        
        String entity = response.readEntity(String.class);

       System.out.println( String.format(
                "GET, status code [%d], returned data: "
                        + System.getProperty( "line.separator" ) + "%s",
                response.getStatus(), entity ) );

       response.close();
        return target;
        // END SNIPPET: testAuthentication
    }
Introducir código aquí...

being the username and password those used to log onto the Neo4j server.

With the authentication method I recover the 'target' object of the 
WebTarget
class and keep it throughout the whole program so as I do not to need to 
login
in each of the different and consecutive methods again.

I added a helper method to extract the path of each node that then I will 
use
in the different methods. The code snippet is as follows,

    private static String extractPathFromNode( URI node ) {
        String auxUri = node.toString();
        return auxUri.replace(SERVER_ROOT_URI, "");
    }
Introducir código aquí...

and what I do is to recover the resulting part of removing the 
SERVER_ROOT_URI root
(the root "http://localhost:7474/db/data/"; is what I used to login) which 
is the
'target' object now.

The rest of the methods will use the 'target' object with the path 
extracted from
the nodes or properties. I supply now the code snippet of each one,


    private static void sendTransactionalCypherQuery( WebTarget target, 
String query ) {
        // START SNIPPET: queryAllNodes
        final String txUri = "transaction/commit";
        //WebResource resource = Client.create().resource( txUri );

       String payload = "{\"statements\" : [ {\"statement\" : \"" + query + 
"\"} ]}";
        
        Response response = target
                .path(txUri)
                .request(MediaType.APPLICATION_JSON)
                .header("application/xml", "true")
                .accept(MediaType.APPLICATION_JSON)
                .post(Entity.entity(payload, MediaType.APPLICATION_JSON_TYPE
));
                
        String entity = response.readEntity(String.class);

       System.out.println( String.format(
                "GET, status code [%d], returned data: "
                        + System.getProperty( "line.separator" ) + "%s",
                response.getStatus(), entity ) );

       response.close();
        // END SNIPPET: queryAllNodes
    }
    
    private static void findSingersInBands( WebTarget target, URI startNode 
)
            //throws URISyntaxException
    {
        // START SNIPPET: traversalDesc
        // TraversalDefinition turns into JSON to send to the Server
        TraversalDefinition t = new TraversalDefinition();
        t.setOrder( TraversalDefinition.DEPTH_FIRST );
        t.setUniqueness( TraversalDefinition.NODE );
        t.setMaxDepth( 10 );
        t.setReturnFilter( TraversalDefinition.ALL );
        t.setRelationships( new Relation( "singer", Relation.OUT ) );
        // END SNIPPET: traversalDesc

       // START SNIPPET: traverse
        //URI traverserUri = new URI( startNode.toString() + 
"/traverse/node" );
        String auxPath = extractPathFromNode( startNode );
        String traverserUri = auxPath + "/traverse/node";
        String jsonTraverserPayload = t.toJson();
        
        // POST {} to the node entry point URI
        Response response = target
                .path(traverserUri)
                .request(MediaType.APPLICATION_JSON)
                .header("application/xml", "true")
                .accept(MediaType.APPLICATION_JSON)
                .post(Entity.entity(jsonTraverserPayload, MediaType.
APPLICATION_JSON_TYPE));
        
        System.out.println( String.format(
                "POST [%s] to [%s], status code [%d], returned data: "
                        + System.getProperty( "line.separator" ) + "%s",
                jsonTraverserPayload, traverserUri, response.getStatus(),
                response.getEntity().toString() ) );
        
        response.close();
        // END SNIPPET: traverse
    }
    
    // START SNIPPET: insideAddMetaToProp
    private static void addMetadataToProperty( WebTarget target, URI 
relationshipUri,
            String name, String value ) //throws URISyntaxException
    {
        //URI propertyUri = new URI( relationshipUri.toString() + 
"/properties" );
        String auxPath = extractPathFromNode( relationshipUri );
        String propertyUri = auxPath + "/properties";
        String entity = toJsonNameValuePairCollection( name, value );
        
        Response response = target
                .path(propertyUri)
                .request(MediaType.APPLICATION_JSON)
                .header("application/xml", "true")
                .accept(MediaType.APPLICATION_JSON)
                .put(Entity.entity(entity, MediaType.APPLICATION_JSON_TYPE
));
        
        System.out.println( String.format(
                "PUT [%s] to [%s], status code [%d]", entity, propertyUri,
                response.getStatus() ) );
        
        response.close();
    }
    // END SNIPPET: insideAddMetaToProp
    
    private static String toJsonNameValuePairCollection( String name,
            String value )
    {
        return String.format( "{ \"%s\" : \"%s\" }", name, value );
    }

    private static URI createNode( WebTarget target )
    {
        // START SNIPPET: createNode
        final String nodeEntryPointUri = "node";
        // http://localhost:7474/db/data/node

       // POST {} to the node entry point URI
        Response response = target
                .path(nodeEntryPointUri)
                .request(MediaType.APPLICATION_JSON)
                .header("application/xml", "true")
                .accept(MediaType.APPLICATION_JSON)
                .post(Entity.entity("{}", MediaType.APPLICATION_JSON_TYPE));

       final URI location = response.getLocation();
        System.out.println( String.format(
            "POST to [%s], status code [%d], location header [%s]",
            nodeEntryPointUri, response.getStatus(), location.toString() ) 
);
        
        response.close();

       return location;
        // END SNIPPET: createNode
    }

    // START SNIPPET: insideAddRel
    private static URI addRelationship( WebTarget target, URI startNode, 
URI endNode,
            String relationshipType, String jsonAttributes )
            //throws URISyntaxException
    {
        //URI fromUri = new URI( startNode.toString() + "/relationships" );
        String auxPath = extractPathFromNode( startNode );
        String fromUri = auxPath + "/relationships";
        String relationshipJson = generateJsonRelationship( endNode,
                relationshipType, jsonAttributes );

       // POST {} to the node entry point URI
        Response response = target
                .path(fromUri)
                .request(MediaType.APPLICATION_JSON)
                .header("application/xml", "true")
                .accept(MediaType.APPLICATION_JSON)
                .post(Entity.entity(relationshipJson, MediaType.
APPLICATION_JSON_TYPE));
        
        final URI location = response.getLocation();
        System.out.println( String.format(
                "POST to [%s], status code [%d], location header [%s]",
                fromUri, response.getStatus(), location.toString() ) );

       response.close();
        return location;
    }
    // END SNIPPET: insideAddRel

    private static String generateJsonRelationship( URI endNode,
            String relationshipType, String... jsonAttributes )
    {
        StringBuilder sb = new StringBuilder();
        sb.append( "{ \"to\" : \"" );
        sb.append( endNode.toString() );
        sb.append( "\", " );

       sb.append( "\"type\" : \"" );
        sb.append( relationshipType );
        if ( jsonAttributes == null || jsonAttributes.length < 1 )
        {
            sb.append( "\"" );
        }
        else
        {
            sb.append( "\", \"data\" : " );
            for ( int i = 0; i < jsonAttributes.length; i++ )
            {
                sb.append( jsonAttributes[i] );
                if ( i < jsonAttributes.length - 1 )
                { // Miss off the final comma
                    sb.append( ", " );
                }
            }
        }

       sb.append( " }" );
        return sb.toString();
    }

    private static void addProperty( WebTarget target, URI nodeUri, String 
propertyName,
            String propertyValue )
    {
        // START SNIPPET: addProp
        String auxPath = extractPathFromNode( nodeUri );
        String propertyUri = auxPath + "/properties/" + propertyName;
        // 
http://localhost:7474/db/data/node/{node_id}/properties/{property_name}
       Response response = target
                .path(propertyUri)
                .request(MediaType.APPLICATION_JSON)
                .header("application/xml", "true")
                .accept(MediaType.APPLICATION_JSON)
                .put(Entity.entity("\"" + propertyValue + "\"", MediaType.
APPLICATION_JSON_TYPE));
        
        System.out.println( String.format( "PUT to [%s], status code [%d]",
                propertyUri, response.getStatus() ) );
        
        response.close();
        // END SNIPPET: addProp
    }
Introducir código aquí...

I hope this be helpful

All the best,
Jose

-- 
You received this message because you are subscribed to the Google Groups 
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to