使用嵌入在Java中的neo4j进行查询 [英] Query using neo4j embedded in java

查看:790
本文介绍了使用嵌入在Java中的neo4j进行查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有2个节点:名称和城市.两者之间的关系是(名称)[:LIVES_IN]->(城市). 我正在尝试生成一个查询,以找出居住在X市(X将来自文本框的人)中的那些人.

我正在尝试按照Luanne和Micheal Hunger的建议构造此查询:

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<String,Object> params=new HashMap<>();
    //result = engine.execute("START n=node(*) MATCH (x:city)<-[:LIVES_IN]-(y:person) where x.name='"+jTextField2.getText()+"' RETURN y.name;");
    //List<String> columns = result.columns();
    //Iterator<Node> n_column = result.columnAs( "person" );
    try (Transaction ignored = graphDb.beginTx()) {
        //result = engine.execute("START n=node(*) MATCH (x:city)<-[:LIVES_IN]-(y:person) where x.name='"+temp+"' RETURN y");
        // 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}})<-[:LIVES_IN]-(person) RETURN person",params);
        System.out.println(result);
        Iterator<Node> 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
    }

但是此查询不会给出任何结果以及任何异常.

我的查询格式正确吗?谁能告诉我该如何解决?我应该更改neo4j版本,因为我正在按照Luanne和Miheal HUnger的要求进行操作.

谢谢

解决方案

您尚未引用城市值:

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

应该是

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

另外,请使用参数:

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

http://docs.neo4j.org/chunked/stable/tutorials-cypher-parameters-java.html

编辑 既然您已经修改了查询,请从迈克尔的评论中尝试

   Map<String,Object> params=new HashMap<String,Object>();
   params.put("city_name","dhaka");
   result=engine.execute("MATCH (city:City {city:{city_name})<-[:LIVES_IN]-(person) RETURN person",params);

   Iterator<Node> n_column = result.columnAs( "person" );

在此之前在City上创建索引: 创建索引:城市(城市) ( http://docs.neo4j.org/chunked/stable/query- schema-index.html )

也请阅读以下学习资料:

在线培训课程: http://www.neo4j.org/learn/online_course

手册: http://docs.neo4j.org/chunked/stable/

了解Cypher: http://www.neo4j.org/tracks/cypher_track_start

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<String,Object> params=new HashMap<>();
    //result = engine.execute("START n=node(*) MATCH (x:city)<-[:LIVES_IN]-(y:person) where x.name='"+jTextField2.getText()+"' RETURN y.name;");
    //List<String> columns = result.columns();
    //Iterator<Node> n_column = result.columnAs( "person" );
    try (Transaction ignored = graphDb.beginTx()) {
        //result = engine.execute("START n=node(*) MATCH (x:city)<-[:LIVES_IN]-(y:person) where x.name='"+temp+"' RETURN y");
        // 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}})<-[:LIVES_IN]-(person) RETURN person",params);
        System.out.println(result);
        Iterator<Node> 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

http://docs.neo4j.org/chunked/stable/tutorials-cypher-parameters-java.html

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

   Map<String,Object> params=new HashMap<String,Object>();
   params.put("city_name","dhaka");
   result=engine.execute("MATCH (city:City {city:{city_name})<-[:LIVES_IN]-(person) RETURN person",params);

   Iterator<Node> 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:

The online training course: http://www.neo4j.org/learn/online_course

The manual: http://docs.neo4j.org/chunked/stable/

Learn Cypher: http://www.neo4j.org/tracks/cypher_track_start

这篇关于使用嵌入在Java中的neo4j进行查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆