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

时间:2016-01-10 09:57:31

标签: java neo4j cypher

我试过的代码是

    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));

               }

但是它会在线程&#34; main&#34;中抛出异常。 java.lang.ClassCastException:scala.collection.convert.Wrappers $ SeqWrapper无法强制转换为org.neo4j.graphdb.Node。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

问题是,在您的密码查询中,您将receiver.person属性收集到名为receiver的数组中。接收者不是一个Node,它是一个属性数组。你不能把它转换成字符串。如果您希望获得实际的接收器节点,则需要将查询语句更改为:

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
}

显然,如果它不是一个字符串,你需要将接收器的类型从String改为适当的类型。

答案 1 :(得分:0)

这很简单。

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();

    }

在比赛查询中,我使用“collect(receiver.person)作为接收者”而不是“collect(receiver)作为接收者”。有效。