java查询neo4j,使用嵌入在Java中的neo4j进行查询

I have 2 nodes: name and city. and a relationship between these two is (name) [:LIVES_IN]->(city).

I am trying to generate a query to find out who are those people living in city X(where X will be coming from a text box).

I am trying this construct this query following Luanne and Micheal Hunger's suggestion:

import java.io.IOException;

import java.util.ArrayList;

import org.neo4j.graphdb.GraphDatabaseService;

import org.neo4j.graphdb.Node;

import org.neo4j.graphdb.RelationshipType;

import org.neo4j.graphdb.Transaction;

import org.neo4j.graphdb.factory.GraphDatabaseFactory;

import org.neo4j.helpers.collection.IteratorUtil;

import org.neo4j.cypher.javacompat.ExecutionEngine;

import org.neo4j.cypher.javacompat.ExecutionResult;

public class registrationFrame extends javax.swing.JFrame {

public static final String DB_PATH = "D://data";

public static GraphDatabaseService graphDb = null;

Node person;

Node password;

Node city;

String nodeResulta;

public registrationFrame() {

initComponents();

}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//node and relationship creation code

try (Transaction tx = graphDb.beginTx();) {

person = graphDb.createNode();

person.setProperty("name", jTextField1.getText());

person.setProperty("password", jPasswordField1.getPassword());

graphDb.index().forNodes("name").add(person, "name", jTextField1.getText());

city = graphDb.createNode();

city.setProperty("city_name", jTextField2.getText());

graphDb.index().forNodes("city_name").add(city, "city_name", jTextField2.getText());

person.createRelationshipTo(city, RelTypes.LIVES_IN);

tx.success();

}

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//query code

ExecutionEngine engine = new ExecutionEngine(graphDb);

ExecutionResult result;

String temp=jTextField2.getText();

Map params=new HashMap<>();

//result = engine.execute("START n=node(*) MATCH (x:city)

//List columns = result.columns();

//Iterator n_column = result.columnAs( "person" );

try (Transaction ignored = graphDb.beginTx()) {

//result = engine.execute("START n=node(*) MATCH (x:city)

// END SNIPPET: execute

// START SNIPPET: items

//result = engine.execute("START n=node(*) MATCH (x:city) RETURN x");//this query also returns nothing

params.put("c_name",temp);

result=engine.execute("MATCH (city_name:city {city_name:{c_name}})

System.out.println(result);

Iterator n_column = result.columnAs("person");

for (Node node : IteratorUtil.asIterable(n_column)) {

// note: we're grabbing the name property from the node,

// not from the n.name in this case.

nodeResulta = node + ": " + node.getProperty("name") + '\n';

//nodeResult1.add(node.getProperty( "name" ).toString());

}

// END SNIPPET: items

}

jTextArea1.setText(nodeResulta);// output will show here

}

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new registrationFrame().setVisible(true);

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

registerShutdownHook(graphDb);

//System.out.println("Created Social Graph!!");

}

});

}

private static void registerShutdownHook(final GraphDatabaseService graphDb) {

Runtime.getRuntime().addShutdownHook(new Thread() {

@Override

public void run() {

graphDb.shutdown();

}

});

}

public static enum RelTypes implements RelationshipType {

LIVES_IN,

FRIEND,

CUISINE,

LIKES,

IN

}

But this query does not give any result as well as any exception.

Is my query formation right? Can any one tell me how can I resolve this? Shall I change my neo4j version because I am following everything as Luanne and Miheal HUnger has asked.

Thank You

解决方案

You have not quoted the city value:

start n=node(*) MATCH n-[:LIVES_IN]->city where city.city=dhaka return n.name

should be

start n=node(*) MATCH n-[:LIVES_IN]->city where city.city='dhaka' return n.name

Also, please use parameters:

start n=node(*) MATCH n-[:LIVES_IN]->city where city.city={city} return n.name

EDIT

Since you've modified your query, from Michael's comment, try

Map params=new HashMap();

params.put("city_name","dhaka");

result=engine.execute("MATCH (city:City {city:{city_name})

Iterator n_column = result.columnAs( "person" );

Create an index on City before that:

CREATE INDEX ON :City(city)

(http://docs.neo4j.org/chunked/stable/query-schema-index.html)

Please also go through the following learning material:

你可能感兴趣的:(java查询neo4j)