我在我的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响应过于混乱会话数据随意。使用代码处理此响应会产生一个复杂的代码,因为在结果(节点,边缘,聚合器)之间包含会话数据似乎不是一致的方式。
我正在寻找解决方案或出路。
答案 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对象。