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: