0

Neo4j 版本:3.2.2

操作系统:Ubuntu 16.04

getDegree()在 mapping.json 文件中使用函数,但返回总是null; 我正在使用数据集 neo4j 教程电影/演员数据集。

elasticsearch 请求的输出

映射.json

{
  "defaults": {
    "key_property": "uuid",
    "nodes_index": "default-index-node",
    "relationships_index": "default-index-relationship",
    "include_remaining_properties": true
  },
  "node_mappings": [
    {
      "condition": "hasLabel('Person')",
      "type": "getLabels()",
      "properties": {
        "getDegree": "getDegree()",
        "getDegree(type)": "getDegree('ACTED_IN')",
        "getDegree(direction)": "getGegree('OUTGOING')",
        "getDegree('type', 'direction')": "getDegree('ACTED_IN', 'OUTGOING')",
        "getDegree-degree": "degree"
      }
    }
  ],
  "relationship_mappings": [
    {
      "condition": "allRelationships()",
      "type": "type",
    }
  ]
}

此外,如果我isOutgoing(), isIncoming(), otherNode在 relationship_mappings 属性部分使用函数,elasticsearch 将永远不会从 neo4j 加载关系数据。我想我可能only when one of the participating nodes "looking" at the relationship is provided对这个页面上的这句话有一些误解 https://github.com/graphaware/neo4j-framework/tree/master/common#inclusion-policies

映射.json

{
  "defaults": {
    "key_property": "uuid",
    "nodes_index": "default-index-node",
    "relationships_index": "default-index-relationship",
    "include_remaining_properties": true
  },
  "node_mappings": [
    {
      "condition": "allNodes()",
      "type": "getLabels()"
    }
  ],
  "relationship_mappings": [
    {
      "condition": "allRelationships()",
      "type": "type",
      "properties": {
        "isOutgoing": "isOutgoing()",
        "isIncomming": "isIncomming()",
        "otherNode": "otherNode"
      }
    }
  ]
}

顺便说一句,是否有任何页面列出了我们可以在 mapping.json 中使用的所有功能?我认识他们两个

  1. github.com/graphaware/neo4j-framework/tree/master/common#inclusion-policies
  2. github.com/graphaware/neo4j-to-elasticsearch/blob/master/docs/json-mapper.md 似乎还有更多,因为我可以使用getType()上述任何页面中未列出的 。

如果我可以提供任何进一步的帮助来解决问题,请告诉我

谢谢!

4

1 回答 1

2

getDegree()功能不可用,相反getType()。我将解释原因:

当映射器(负责创建节点或关系表示为 ES 文档的部分)正在执行其工作时,它会收到DetachedGraphObject一个分离的节点或关系。

的含义detached是它发生在事务之外,因此查询操作不再适用于数据库。之所以getType()可用,是因为它是关系元数据的一部分,而且价格便宜,但是如果我们想为此做同样的事情,getDegree()在创建期间(发生在 tx 中)可能会更加昂贵,DetachedObject具体取决于不同类型的数量等.

然而,这是我们正在做的事情,通过在独立的 java 应用程序中外部化映射器,并在 neo 和这个应用程序之间加上一个代理,如 kafa、rabbit 等。但是,我们不会提供在当前版本的模块中重新查询图表的可能性,因为如果用户不是很小心,它可能会对性能产生严重影响。

最后,我能给您的唯一建议是在您的节点上保留一个属性,其中包含您需要复制到 ES 的度数更新。

更新

关于文档的这一部分:

仅当提供“查看”关系的参与节点之一时,才适用于关系:

这仅在不使用 json 定义时使用,因此您可以使用其中一种。json 定义后来作为添加添加,两者不能一起使用。

为了回答这部分,这意味着根据定义,传入或传出端的节点应包含在节点的包含策略中,例如hasLabel('Employee') || hasProperty('form') || getProperty('age', 0) > 20. 如果你有一个allNodes政策,那很好。

于 2017-08-05T20:00:23.270 回答