Разрешить параметры для глубины в запросе Cypher - PullRequest
0 голосов
/ 05 марта 2019

Я использую Neo4j Bolt Driver 1.7 для Python , чтобы извлечь пути из конкретной базы данных, вот пример кода, который вызывает проблему.

from neo4j import GraphDatabase

uri = "bolt://0.0.0.0:7878"
driver = GraphDatabase.driver(uri, auth=("neo4j", "neo4j"))

db = driver.session()
query =  '''
    MATCH tree = (n:Class)-[r:SUBCLASSOF*{depth}]->(parent)      # <---- ERROR here
    WHERE n.obo_id = {go}
    RETURN [n in nodes(tree) | n.obo_id] as GOID
'''
results = []
goid = "GO:0051838"
for record in db.run(query, go=goid, depth="..2"):
    results.append(record["GOID"])

print(results)

Когда я использую {depth} параметр Я получаю следующую ошибку:

Traceback (most recent call last):
  File "neoEnrich.py", line 16, in <module>
    for record in db.run(query, go=goid, depth="..2"):
  File "/usr/local/lib/python3.6/site-packages/neo4j/__init__.py", line 499, in run
    self._connection.fetch()
  File "/usr/local/lib/python3.6/site-packages/neobolt/direct.py", line 414, in fetch
    return self._fetch()
  File "/usr/local/lib/python3.6/site-packages/neobolt/direct.py", line 454, in _fetch
    response.on_failure(summary_metadata or {})
  File "/usr/local/lib/python3.6/site-packages/neobolt/direct.py", line 738, in on_failure
    raise CypherError.hydrate(**metadata)
neobolt.exceptions.CypherSyntaxError: Parameter maps cannot be used in MATCH patterns (use a literal map instead, eg. "{id: {param}.id}") (line 2, column 38 (offset: 42))
"    MATCH tree = (n:Class)-[r:SUBCLASSOF*{depth}]->(parent)"
                                          ^

при замене {depth} на ..2, я получил желаемый результат:

[['GO:0051838', 'GO:0051801'],
 ['GO:0051838', 'GO:0051801', 'GO:0051883'],
 ['GO:0051838', 'GO:0051801', 'GO:0051715'],
 ['GO:0051838', 'GO:0051873'],
 ['GO:0051838', 'GO:0051873', 'GO:0051883'],
 ['GO:0051838', 'GO:0051873', 'GO:0051852']]

Есть ли способ разрешить параметрыдля глубины здесь?Поскольку пользователь будет указывать глубину (будет параметром функции).

Ответы [ 4 ]

1 голос
/ 05 марта 2019

Параметры не позволяют устанавливать метки узлов, метки отношений, глубины отношений.

Если вам действительно нужна эта глубина в качестве параметра, то создайте запрос в виде строки в python и передайте ему глубину отношений в качестве параметра.

Сохранить другие параметры (здесь go), как в запросе.

0 голосов
/ 06 марта 2019

Благодаря ответу @Raj самым простым решением, которое я нашел, было использование .format()

Запрос становится:

query =  '''
    MATCH tree = (n:Class)-[r:SUBCLASSOF*{depth}]->(parent)
    WHERE n.obo_id = "{go}"
    RETURN [n in nodes(tree) | n.obo_id] as GOID
'''

Затем построил запрос и выполнил db.run()

full_query = query .format(go=goid, depth="..2")
for record in db.run(full_query):
    ...
0 голосов
/ 05 марта 2019

Вы можете использовать параметры для minLevel и maxLevel аргументов функции APOC apoc.path.expand .

Например:

MATCH (n:Class)
WHERE n.obo_id = $go
CALL apoc.path.expand(n, "SUBCLASSOF>", "", 1, $depth) YIELD path
RETURN [n IN NODES(path) | n.obo_id] AS GOID
0 голосов
/ 05 марта 2019

А как же

MATCH tree = (n:Class)-[r:SUBCLASSOF*..10]->(parent)
WHERE LENGTH(tree)<=$depth
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...