将cypher查询的结果收集到哈希映射java中?

时间:2016-01-09 13:02:59

标签: java neo4j hashmap cypher

这是Finding connected nodes问题的后续内容。

代码是

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

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


    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 ");
        System.out.println(result.dumpToString());

我得到的结果是:

 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 "}

如何将发件人作为键和接收者收集为值? 例如:{Frank =[David, Elsa], Chris =[Elsa, Andy, Nobby]..

有什么想法吗?

最初我尝试迭代这样的东西

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

               }

这会抛出一个classcast异常。它适用于列&#34;发送者&#34;而不是&#34;接收者&#34;。

我对cypher很新。我不知道如何将结果转换为哈希映射。这怎么可能?

2 个答案:

答案 0 :(得分:0)

您可以重写密码以返回地图而不是...(为了便于阅读而拆分)

MATCH (sender:person)-[:emails]->(receiver)
WITH sender, collect(receiver.person) as receivers
RETURN {sender: sender.person,  receivers: receivers)
ORDER BY size(receivers) DESC

答案 1 :(得分:0)

结果可以看作是一个映射列表,每个映射代表其记录在结果中的键值映射。

实现此目的的代码:

private List<Map<String, Object>> buildResultsList(Result result) {
        List<Map<String, Object>> results = new LinkedList<>();
        while (result.hasNext()) {
            Record record = result.next();
            results.add(record.asMap());
        }
        return results;
    }