如何使用Neo4j :: Session.query格式化自定义密码查询的输出(删除会话数据)

时间:2016-06-03 18:26:25

标签: ruby-on-rails neo4j cypher neo4j.rb

我在我的Rails应用程序中使用Neo4jrb / Neo4j-core进行自定义cypher查询。我把这个输出用作json。但是,每次我运行查询

例如:

output_hash = Neo4j::Session.query("Match (n) return n limit 1;")

除了结果,我还会收到很多关于会话本身的不需要的信息。

EACH节点包含以下内容。

      "session": {
    "connection": {
      "parallel_manager": null,
      "headers": {
        "Content-Type": "application/json",
        "User-Agent": "neo4j-gem/7.0.6 (https://github.com/neo4jrb/neo4j)"
      },
      "params": {},
      "options": {
        "params_encoder": null,
        "proxy": null,
        "bind": null,
        "timeout": null,
        "open_timeout": null,
        "boundary": null,
        "oauth": null
      },
      "ssl": {
        "verify": null,
        "ca_file": null,
        "ca_path": null,
        "verify_mode": null,
        "cert_store": null,
        "client_cert": null,
        "client_key": null,
        "certificate": null,
        "private_key": null,
        "verify_depth": null,
        "version": null
      },
      "default_parallel_manager": null,
      "builder": {
        "handlers": [
          {
            "name": "Faraday::Request::BasicAuthentication",
            "args": [
              "neo4j",
              "root"
            ],
            "block": null
          },
          {
            "name": "FaradayMiddleware::MultiJson::EncodeJson",
            "args": [],
            "block": null
          },
          {
            "name": "FaradayMiddleware::MultiJson::ParseJson",
            "args": [
              {
                "symbolize_keys": true,
                "content_type": "application/json"
              }
            ],
            "block": null
          },
          {
            "name": "Faraday::Adapter::NetHttpPersistent",
            "args": [],
            "block": null
          }
        ],
        "app": {
          "header_value": "Basic bmVvNGo6cm9vdA==",
          "app": {
            "app": {
              "app": {
                "app": {}
              },
              "options": {
                "symbolize_keys": true,
                "content_type": "application/json"
              },
              "content_types": [
                "application/json"
              ]
            }
          }
        }
      },
      "url_prefix": {
        "scheme": "http",
        "user": null,
        "password": null,
        "host": "localhost",
        "port": 7474,
        "path": "/",
        "query": null,
        "opaque": null,
        "fragment": null,
        "parser": {
          "regexp": {
            "SCHEME": "(?-mix:\\A[A-Za-z][A-Za-z0-9+\\-.]*\\z)",
            "USERINFO": "(?-mix:\\A(?:%\\h\\h|[!$&-.0-;=A-Z_a-z~])*\\z)",
            "HOST": "(?-mix:\\A(?:(?<IP-literal>\\[(?:(?<IPv6address>(?:\\h{1,4}:){6}(?<ls32>\\h{1,4}:\\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5]|\\d)\\.\\g<dec-octet>\\.\\g<dec-octet>\\.\\g<dec-octet>))|::(?:\\h{1,4}:){5}\\g<ls32>|\\h{,4}::(?:\\h{1,4}:){4}\\g<ls32>|(?:(?:\\h{1,4}:)?\\h{1,4})?::(?:\\h{1,4}:){3}\\g<ls32>|(?:(?:\\h{1,4}:){,2}\\h{1,4})?::(?:\\h{1,4}:){2}\\g<ls32>|(?:(?:\\h{1,4}:){,3}\\h{1,4})?::\\h{1,4}:\\g<ls32>|(?:(?:\\h{1,4}:){,4}\\h{1,4})?::\\g<ls32>|(?:(?:\\h{1,4}:){,5}\\h{1,4})?::\\h{1,4}|(?:(?:\\h{1,4}:){,6}\\h{1,4})?::)|(?<IPvFuture>v\\h+\\.[!$&-.0-;=A-Z_a-z~]+))\\])|\\g<IPv4address>|(?<reg-name>(?:%\\h\\h|[!$&-.0-9;=A-Z_a-z~])*))\\z)",
            "ABS_PATH": "(?-mix:\\A\\/(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~])*(?:\\/(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~])*)*\\z)",
            "REL_PATH": "(?-mix:\\A(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~])+(?:\\/(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~])*)*\\z)",
            "QUERY": "(?-mix:\\A(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~\\/?])*\\z)",
            "FRAGMENT": "(?-mix:\\A(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~\\/?])*\\z)",
            "OPAQUE": "(?-mix:\\A(?:[^\\/].*)?\\z)",
            "PORT": "(?-mix:\\A[\\x09\\x0a\\x0c\\x0d ]*\\d*[\\x09\\x0a\\x0c\\x0d ]*\\z)"
          }
        }
      },
      "proxy": null
    },
    "resource_data": {
      "extensions": {},
      "node": "http://localhost:7474/db/data/node",
      "relationship": "http://localhost:7474/db/data/relationship",
      "node_index": "http://localhost:7474/db/data/index/node",
      "relationship_index": "http://localhost:7474/db/data/index/relationship",
      "extensions_info": "http://localhost:7474/db/data/ext",
      "relationship_types": "http://localhost:7474/db/data/relationship/types",
      "batch": "http://localhost:7474/db/data/batch",
      "cypher": "http://localhost:7474/db/data/cypher",
      "indexes": "http://localhost:7474/db/data/schema/index",
      "constraints": "http://localhost:7474/db/data/schema/constraint",
      "transaction": "http://localhost:7474/db/data/transaction",
      "node_labels": "http://localhost:7474/db/data/labels",
      "neo4j_version": "3.0.1"
    },
    "resource_url": "http://localhost:7474/db/data/"
  }

会话数据似乎包含很多敏感信息,所以我无法直接使用输出。

我想避免这种情况,只是简单,必要,输出到我的密码查询,没有额外的信息。是否有可用于完成此操作的配置设置?

谢谢。

更新 我实际上使用 Neo4jrb / Neo4j (包括Neo4j-core)作为ActiveModel的替代,用于此项目中的一些基本任务。以及主要任务的自定义查询。

进一步检查:

只要定义了ActiveNode模型,我就会得到一个没有任何额外(会话)数据的明确响应。但只返回模型文件中定义的属性。

class User
    include Neo4j::ActiveNode

    property :name, type: String
    property :email, type: String
end

这适用于User模型,默认情况下,根据文档忽略模型文件中未声明的任何属性(但存在于数据库中)。

我的问题:我的图表中有一些节点会有许多不同的属性键,这些属性键无法事先硬编码到模型文件中(使用无列数据库的原因)。我无法在模型中声明这些节点的所有属性。

所以我试图像Neo4j :: Session.query(q)那样尝试自定义密码查询但是JSON响应过于混乱会话数据随意。使用代码处理此响应会产生一个复杂的代码,因为在结果(节点,边缘,聚合器)之间包含会话数据似乎不是一致的方式。

我正在寻找解决方案或出路。

2 个答案:

答案 0 :(得分:1)

感谢Brian的帮助。 总结一下:

输出中的UINavigationBar *navBarAppearance = [UINavigationBar appearance]; [navBarAppearance setTintColor:[UIColor greenColor]]; 键是因为let navBarAppearace = UINavigationBar.appearance() navBarAppearace.tintColor = UIColor.greenColor() 尽可能返回相应的对象(节点/边缘),请参阅源代码中的this line here。 CypherNode和CypherRelationship类都有@session变量,当它们的对象转换为JSON / Hash / YAML时,session数据被自动包含。

一种选择是编写自己的自定义方法并扩展类以提供更清晰的JSON输出。 Brian提到即将推出的8.0将在响应中提供语法选项。或者,您可以在应用中编写自定义代码,以处理Neo4j-core的响应。

我终于完成了后者,如下所示:

session

答案 1 :(得分:0)

好吧,似乎可能会有一些事情发生;)

首先,关于未定义的属性,最近这里有一个问题主题:

https://github.com/neo4jrb/neo4j/issues/1209

现在,您应该可以使用user._persisted_obj.props获取节点的所有属性,即使它们未在ActiveNode模型中定义。

关于JSON,我想我知道你在说什么。实际上,我认为Enumerator对渲染JSON没有很好的支持。我以前见过人们有这个问题,但它只是点击了原因。现在,试试:

render json: query_result_enumerator.map(&:to_h)

那应该转换为Hash个对象的数组和Hash以及所有支持jSONified的封闭节点/ rel对象。