【问题标题】:Collecting the result of cypher query into a hash map java?将密码查询的结果收集到哈希映射 java 中?
【发布时间】:2016-01-09 13:02:59
【问题描述】:

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

               }

这会引发类转换异常。它适用于“发送者”列,而不适用于“接收者”。

我对密码很陌生。我不知道如何将结果转换为哈希图。这怎么可能?

【问题讨论】:

    标签: java neo4j hashmap cypher


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。上面的代码抛出错误。我不希望结果只是外观上的地图。但结构本身应该是地图形式。因为如果我想获取特定键的值,例如 result.get(2) 不会返回第二个键的值。我想我需要类似 map.put(sender, receiver)
    【解决方案2】:

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

    实现此目的的代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 2021-08-13
      • 2018-10-13
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多