使用cypher获取带有标签和索引的节点

时间:2014-08-12 06:43:47

标签: java neo4j cypher

我想使用cypher查询使用标签和索引来获取节点及其信息,但我仍然在CypherQuery()方法中的变量“result”中获取空值。

NewCypherQuery.java(bean)

public class NewCypherQuery {
private static final String DB_PATH = "/var/lib/neo4j/data/";
private static String resultString;
private static String columnsString, nodeResult, rows = "", query;
private static ExecutionResult result;
private static ExecutionEngine engine;
private static GraphDatabaseService db;
private static Node amad = null, pari = null, sona = null;
private static Relationship rel;
private static IndexDefinition inxamd, inxpri;
private static Label amd,pri;

public static void callAllMethods() {
    clearDbPath();
    setUp();
    createNodes();
    CypherQuery();

  }

public static void CypherQuery() {
    try (Transaction ignored = db.beginTx();) {
result = engine.execute("MATCH (m:inxamd)-->(n:inxpri) USING INDEX m:inxamd(name)     USING INDEX n:inxpri(name) WHERE m.name = 'Amad' AND n.name= 'Pari' RETURN m");
        for (Map<String, Object> row : result) {
            resultString = engine.execute("MATCH (m:inxamd)-->(n:inxpri) USING INDEX m:inxamd(name)  USING INDEX n:inxpri(name) WHERE m.name = 'Amad' AND n.name= 'Pari' RETURN m").dumpToString();
        System.out.println(resultString);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}
private static void setUp() {
    try {
        db = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);

        try (Transaction tx = db.beginTx()) {
            engine = new ExecutionEngine(db);
            Schema schema = db.schema();
            inxamd = schema.indexFor(amd).on("name").create();
            inxpri = schema.indexFor(pri).on("name").create();
            tx.success();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static void createNodes() {
    try (Transaction tx = db.beginTx();) {

        amad = db.createNode();
        amad.setProperty("name", "Amad");
        amad.setProperty("age", 24);
        amad.setProperty("edu", "mscit");

        pari = db.createNode();
        pari.setProperty("name", "Pari");
        pari.setProperty("age", 20);
        pari.setProperty("edu", "mscit");

        sona = db.createNode();
        sona.setProperty("name", "Sona");
        sona.setProperty("age", 21);
        sona.setProperty("edu", "mscit");

        rel = amad.createRelationshipTo(pari, RelTypes.KNOWS);
        rel.setProperty("rel", "friend");
        rel = pari.createRelationshipTo(sona, RelTypes.KNOWS);
        rel.setProperty("rel", "friend");
    System.out.println("Nodes created.....");
        tx.success();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static void clearDbPath() {
    try {
        deleteRecursively(new File(DB_PATH));
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
}

InsertNodes.java(Servlet): -

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws   ServletException, IOException {
    // TODO Auto-generated method stub
    NewCypherQuery ncq=new NewCypherQuery();
    ncq.callAllMethods();
}

的index.jsp

<form method="post" action="InsertNodes">
<input type="text" name="txtname" value="Hello World !!!!!"></input>
<input type="submit" value="Neo4j World"></input>
</form>

1 个答案:

答案 0 :(得分:1)

您还没有真正定义两个标签amd(inxamd)和pri(inxpri)的值,也没有将它们分配给任何创建的节点。

您可以实现Label类并为标签指定名称,例如&#34; inxamd&#34;或使用DynamicLabel。 然后,使用

将标签分配给您的节点
amad.addLabel(thelabel);

与上述问题无关,标签名称通常是一个描述性字符串,表示该节点属于哪个集合,例如人,狗 在大多数情况下,您不需要明确提供索引提示(USING INDEX

相关问题