Skip to content

Added cypher support #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 17 additions & 3 deletions src/main/java/org/neo4j/rest/graphdb/RestGraphDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
package org.neo4j.rest.graphdb;


import java.util.Map;

import org.neo4j.graphdb.DynamicRelationshipType;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
Expand All @@ -28,8 +30,6 @@
import org.neo4j.rest.graphdb.query.RestCypherQueryEngine;
import org.neo4j.rest.graphdb.util.ResultConverter;

import java.util.Map;


public class RestGraphDatabase extends AbstractRemoteDatabase {
private RestAPI restAPI;
Expand Down Expand Up @@ -59,18 +59,22 @@ public RestAPI getRestAPI(){
}


@Override
public RestIndexManager index() {
return this.restAPI.index();
}

@Override
public Node createNode() {
return this.restAPI.createNode(null);
}

@Override
public Node getNodeById( long id ) {
return this.restAPI.getNodeById(id);
}

@Override
public Node getReferenceNode() {
return this.restAPI.getReferenceNode();
}
Expand All @@ -80,16 +84,26 @@ public Iterable<Node> getAllNodes() {
return cypherQueryEngine.query("start n=node(*) return n", null).to(Node.class);
}

public Iterable<Map<String, Object>> execute( String statement, Map<String, Object> params )
{
return cypherQueryEngine.query( statement, params );
}


@Override
public Iterable<RelationshipType> getRelationshipTypes() {
return cypherQueryEngine.query("start n=node(*) match n-[r]->() return distinct type(r) as rel_type", null).to(RelationshipType.class, new ResultConverter<Map<String, Object>, RelationshipType>() {
return cypherQueryEngine.query( "start n=node(*) match n-[r]->() return distinct type(r) as rel_type", null ).to(
RelationshipType.class,//
new ResultConverter<Map<String, Object>, RelationshipType>()
{
@Override
public RelationshipType convert(Map<String, Object> row, Class<RelationshipType> type) {
return DynamicRelationshipType.withName((String)row.get("rel_type"));
}
});
}

@Override
public Relationship getRelationshipById( long id ) {
return this.restAPI.getRelationshipById(id);
}
Expand Down
49 changes: 37 additions & 12 deletions src/main/java/org/neo4j/rest/graphdb/entity/RestNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.neo4j.helpers.collection.CombiningIterable;
import org.neo4j.helpers.collection.IterableWrapper;
import org.neo4j.helpers.collection.IteratorUtil;
import org.neo4j.kernel.impl.traversal.OldTraverserWrapper;
import org.neo4j.rest.graphdb.RestAPI;
import org.neo4j.rest.graphdb.traversal.RestDirection;

Expand All @@ -51,14 +52,17 @@ public RestNode( Map<?, ?> data, RestAPI restApi ) {
super( data, restApi );
}

@Override
public Relationship createRelationshipTo( Node toNode, RelationshipType type ) {
return this.restApi.createRelationship(this,(RestNode)toNode,type,null);
return this.restApi.createRelationship(this,toNode,type,null);
}

@Override
public Iterable<Relationship> getRelationships() {
return restApi.wrapRelationships( restRequest.get( "relationships/all" ) );
}

@Override
public Iterable<Relationship> getRelationships( RelationshipType... types ) {
String path = getStructuralData().get( "all_relationships" ) + "/";
int counter = 0;
Expand All @@ -72,52 +76,70 @@ public Iterable<Relationship> getRelationships( RelationshipType... types ) {
}


@Override
public Iterable<Relationship> getRelationships( Direction direction ) {
return restApi.wrapRelationships( restRequest.get( "relationships/" + RestDirection.from( direction ).shortName ) );
}

@Override
public Iterable<Relationship> getRelationships( RelationshipType type,
Direction direction ) {
String relationshipsKey = RestDirection.from( direction ).longName + "_relationships";
Object relationship = getStructuralData().get( relationshipsKey );
return restApi.wrapRelationships( restRequest.get( relationship + "/" + type.name() ) );
}

@Override
public Relationship getSingleRelationship( RelationshipType type,
Direction direction ) {
return IteratorUtil.singleOrNull( getRelationships( type, direction ) );
}

@Override
public boolean hasRelationship() {
return getRelationships().iterator().hasNext();
}

@Override
public boolean hasRelationship( RelationshipType... types ) {
return getRelationships( types ).iterator().hasNext();
}

@Override
public boolean hasRelationship( Direction direction ) {
return getRelationships( direction ).iterator().hasNext();
}

@Override
public boolean hasRelationship( RelationshipType type, Direction direction ) {
return getRelationships( type, direction ).iterator().hasNext();
}

public Traverser traverse( Order order, StopEvaluator stopEvaluator,
ReturnableEvaluator returnableEvaluator, Object... rels ) {
throw new UnsupportedOperationException();
@Override
public Traverser traverse( Order traversalOrder, StopEvaluator stopEvaluator,
ReturnableEvaluator returnableEvaluator, Object... relationshipTypesAndDirections )
{
return OldTraverserWrapper.traverse( this, traversalOrder, stopEvaluator, returnableEvaluator,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Imho this old-traverser does not the correct thing as it would execution the traversal over the wire for each step, it should rather use RestTraversal.description() to build up the query (in a similar fashion), which would be executed on the server-side.

relationshipTypesAndDirections );

}

public Traverser traverse( Order order, StopEvaluator stopEvaluator,
ReturnableEvaluator returnableEvaluator, RelationshipType type, Direction direction ) {
throw new UnsupportedOperationException();
@Override
public Traverser traverse( Order traversalOrder, StopEvaluator stopEvaluator,
ReturnableEvaluator returnableEvaluator, RelationshipType relationshipType, Direction direction )
{

return OldTraverserWrapper.traverse( this, traversalOrder, stopEvaluator, returnableEvaluator,
relationshipType, direction );
}

public Traverser traverse( Order order, StopEvaluator stopEvaluator,
ReturnableEvaluator returnableEvaluator, RelationshipType type, Direction direction,
RelationshipType secondType, Direction secondDirection ) {
throw new UnsupportedOperationException();
@Override
public Traverser traverse( Order traversalOrder, StopEvaluator stopEvaluator,
ReturnableEvaluator returnableEvaluator, RelationshipType firstRelationshipType, Direction firstDirection,
RelationshipType secondRelationshipType, Direction secondDirection )
{
return OldTraverserWrapper.traverse( this, traversalOrder, stopEvaluator, returnableEvaluator,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above.

firstRelationshipType, firstDirection, secondRelationshipType, secondDirection );
}

@Override
Expand All @@ -133,7 +155,10 @@ protected Iterable<Relationship> underlyingObjectToObject(RelationshipType relat
@Override
public boolean hasRelationship(Direction direction, RelationshipType... types) {
for (RelationshipType relationshipType : types) {
if (hasRelationship(relationshipType,direction)) return true;
if (hasRelationship(relationshipType,direction))
{
return true;
}
}
return false;
}
Expand Down