Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用cypher迭代具有多个值的列?_Java_Neo4j_Cypher - Fatal编程技术网

Java 如何使用cypher迭代具有多个值的列?

Java 如何使用cypher迭代具有多个值的列?,java,neo4j,cypher,Java,Neo4j,Cypher,我试过的代码是 firstNode = graphDb.createNode();//creating nodes like this firstNode.setProperty( "person", "Andy " ); Label myLabel = DynamicLabel.label("person"); firstNode.addLabel(myLabel); ... relationship = firstNode.createRelati

我试过的代码是

    firstNode = graphDb.createNode();//creating nodes like this
    firstNode.setProperty( "person", "Andy " ); 
    Label myLabel = DynamicLabel.label("person");
    firstNode.addLabel(myLabel); ...

    relationship = firstNode.createRelationshipTo( secondNode, RelTypes.emails );// creating relationships like this
    relationship.setProperty( "relationship", "email " );....


    Transaction tx1 = graphDb.beginTx();
    try{
        ExecutionEngine engine = new ExecutionEngine(graphDb);

        ExecutionResult result = engine.execute("MATCH (sender:person)-[:emails]-(receiver) RETURN sender,  count(receiver)as count, collect(receiver) as receivers ORDER BY count DESC ");..
我得到的结果是:

 sender                  | count | receivers                                                                 
Node[2]{person:"Chris"} | 3     | [Node[4]{person:"Elsa "},Node[0]{person:"Andy "},Node[1]{person:"Bobby"}] 
Node[4]{person:"Elsa "} | 3     | [Node[5]{person:"Frank"},Node[2]{person:"Chris"},Node[3]{person:"David"}]
Node[1]{person:"Bobby"} | 3     | [Node[2]{person:"Chris"},Node[3]{person:"David"},Node[0]{person:"Andy "}]
Node[5]{person:"Frank"} | 2     | [Node[3]{person:"David"},Node[4]{person:"Elsa "}
我想迭代接收器。因此,我尝试了以下方法:

for (Map<String,Object> row : result) {
               Node x = (Node)row.get("receivers");
               System.out.println(x);

               for (String prop : x.getPropertyKeys()) {
                  System.out.println(prop +": "+x.getProperty(prop));

               }
for(映射行:结果){
Node x=(Node)row.get(“接收者”);
系统输出println(x);
对于(字符串属性:x.getPropertyKeys()){
System.out.println(prop+“:”+x.getProperty(prop));
}
但它在线程“main”java.lang.ClassCastException中引发异常:scala.collection.convert.Wrappers$SeqWrapper不能强制转换为org.neo4j.graphdb.Node


如何执行此操作?

问题在于,在cypher查询中,您将receiver.person属性收集到一个名为receivers的数组中。receivers不是一个节点,而是一个属性数组。您不能将其转换为字符串。如果您希望获得实际的receiver节点,则需要将查询语句更改为:

MATCH (sender:person)-[:emails]-(receiver) RETURN sender, count(receiver)as count, receiver as receivers ORDER BY count DESC
或者,如果要使用属性数组,则可以执行类似以下代码的操作:

Object receivers = row.get("receivers")
if(receivers instanceof String[]) {
  for(String receiver in receivers) {
    .. do something
  }
} else {
  // do something with receiver as a single string value
}
显然,如果不是字符串,您需要将接收器的类型从字符串更改为适当的类型。

这是一件简单的事情

try{
        ExecutionEngine engine = new ExecutionEngine(graphDb);

        ExecutionResult result = engine.execute("MATCH (sender:person)-[:emails]-(receiver) RETURN sender,  count(receiver)as count, collect(receiver.person) as receivers ORDER BY count DESC ");
        //ExecutionResult result = engine.execute("MATCH (sender:person)-[:emails]->(receiver)  WITH sender, collect(receiver.person) as receivers, RETURN {sender: sender.person,  receivers: receivers) ORDER BY size(receivers) DESC");
        //System.out.println(result.dumpToString());
        LinkedList list_prop = new LinkedList();

        for (Map<String,Object> row : result) {
            Node x = (Node)row.get("sender");
            Object y = row.get("receivers");
            System.out.println(y);  

            for (String prop_x : x.getPropertyKeys()) {
                System.out.println(prop_x +": "+x.getProperty(prop_x));

            }   

        }
        tx1.success();
    }
    finally {
        tx1.close();

    }
试试看{
ExecutionEngine=新的ExecutionEngine(graphDb);
ExecutionResult=engine.execute(“匹配(发送方:个人)-[:电子邮件](接收方)返回发送方,计数(接收方)作为计数,按计数描述收集(接收方.个人)作为接收方订单”);
//ExecutionResult=engine.execute(“匹配(发送者:人)-[:电子邮件]->(接收者)与发送者,收集(接收者.人)作为接收者,返回{发送者:发送者.人,接收者:接收者)按大小排序(接收者)描述”);
//System.out.println(result.dumpToString());
LinkedList_prop=新建LinkedList();
用于(地图行:结果){
Node x=(Node)row.get(“发送方”);
对象y=行获取(“接收者”);
系统输出打印项次(y);
对于(字符串prop_x:x.getPropertyKeys()){
System.out.println(prop_x+”:“+x.getProperty(prop_x));
}   
}
tx1.成功();
}
最后{
tx1.close();
}

在匹配查询中,我使用了“collect(receiver.person)as receivers”而不是“collect(receiver)as receivers”。它起作用了。

谢谢你的回答。是的。row.get(“receivers”)只会抛出错误。但是get(“sender”)起作用了!!。我已经编辑了这个问题。