使用python驱动程序从neo4j获取元素沿着ID

qacovj5a  于 2023-02-19  发布在  Python
关注(0)|答案(1)|浏览(181)

我使用的是python neo4j驱动程序(5.5.0)来查询neo4j aura数据库中的数据,以便在我的python应用程序中使用。(构建图形可视化),因为它只返回节点属性,而不返回ID/标签。没有连接节点的id(虽然它确实给予了连接节点的属性)。2但是我真的很想有id来保证图的一致性。
我有以下neo4j Cypher查询

f" MATCH (d:Document)",
f" WHERE d.doc_id IN {doc_ids}",
f" UNWIND d as doc",
f"  CALL {{",
f"      WITH doc",
f"      MATCH (doc:Document)-[de:CONTAINS_ENTITY]->(e:Entity_node)-[ec:ENTITY_CONCEPT_ASSOCIATION]->(c: Concept)",
f"      WITH doc, ",
f"      {{ sub: doc, rel_id: id(de), rel_type: type(de), obj: e }} as contains,",
f"      {{ sub: e, rel_id: id(ec), rel_type: type(ec), obj: c }} as represents LIMIT {num_of_ents}"
f"      MATCH (a:Author)-[ad:AUTHORED]->(doc)",
f"      RETURN", 
f"          {{ contains: contains, represents: represents }} as entities,",
f"          {{ sub: a, rel_id: id(ad), rel_type: type(ad), obj: doc }} as authors",
f"  }}",
f" RETURN doc, collect(entities) as entities, collect(authors) as authors"

传递给neo4j驱动程序的session.run()函数
它有点复杂,而且基本上不相关,所以假设这是查询

f" MATCH (d:Document)",
f" WHERE d.doc_id IN {doc_ids}",
f" RETURN d"

这将返回如下响应..

[
    {
        "d": {
            "title": "Coronavirus and paramyxovirus in bats from Northwest Italy",
            "doc_id": "a03517f26664be79239bcdf3dbb0966913206a86"
        }
    },
    ...
]

然而,在neo4j浏览器中,相同的查询将返回不同格式的响应

[
  {
    "identity": 23016,
    "labels": [
      "Document"
    ],
    "properties": {
      "title": "Coronavirus and paramyxovirus in bats from Northwest Italy",
      "doc_id": "a03517f26664be79239bcdf3dbb0966913206a86"
    },
    "elementId": "23016"
  },
  ...
]

这些响应包含节点的id和应用程序所需的标签,而且关系也包含开始和结束id。
我如何使用neo4j python驱动程序获得这些值?我尝试了Result & Record对象上所有可用的函数[data(),values(),items()],但没有一个给予id/标签。graph()函数给节点提供id,但根本没有关系(空列表)。
我知道在Cypher查询本身中使用id()和labels()函数,但考虑到查询的大小,这似乎会大大增加响应时间。
graph()函数有id这个事实告诉我,初始的Result对象在某个地方有id,我该如何访问它?

rkttyhzu

rkttyhzu1#

属性“id”和“labels”由neo4j数据库管理。要访问此属性,您必须使用文档的https://neo4j.com/docs/cypher-manual/current/functions/中描述的内置密码函数。
根据您的简化示例,获取标签和ID的过程如下所示:

f" MATCH (d:Document)",
f" WHERE d.doc_id IN {doc_ids}",
f" WITH *, labels(d) as doc_labels",
f" WITH *, id(d) as doc_id",
f" RETURN doc_id, doc_labels"

或者假设“your”doc_id是搜索的节点id,并且您只想在WHERE子句中将其与外部参数“doc_ids”进行比较:

f" MATCH (d:Document)",
f" WHERE id(d) IN {doc_ids}",
f" WITH *, labels(d) as doc_labels",
f" WITH *, id(d) as doc_id",
f" RETURN doc_id, doc_labels"

标签以“字符串列表”(一种密码数据类型)的形式返回,其中包含了节点上附加的所有标签,id是一个整数值。
查询的结果应如下所示:

doc_id        doc_labels        
0             ["Document", "second_label"]
1             ["Document"]

你好,奥顿纳瓦尔

相关问题