Как посчитать отношения (одного типа) к узлу, используя py2neo - PullRequest
1 голос
/ 16 марта 2019

Использование py2neo 4.x, neo4j 3.5.3, python 3.7.x

Что у меня есть: узел из графа a

graph = Graph(
    host="alpha.graph.domain.co",
    auth=('neo4j', 'theActualPassword')
)
# grab the graph
a = Node("Type", url="https://en.wikipedia.org/wiki/Vivendi")
# create a local node with attributes I should be able to MERGE on
graph.merge(a,"Type","url")
# do said merge
graph.pull(a)
# pull any attributes (in my case Labels) that exist on the node in neo4j...
# ...but not on my local node
# better ways to do this also would be nice in the comments
relMatch = RelationshipMatcher(graph)

Что я хочу:подсчет количества "CREATED" отношений, связанных с aA neo4j return describing how these relationships are connected to node a (в данном случае 7)

Что я пробовал:

x = relMatch.get(20943820943) используя один из идентификаторов отношений, чтобы увидеть, что к чему.Он возвращает None, что, скажем, документы означает

Если таких отношений не найдено, py: const: вместо этого возвращается None.Сравните это с matcher [1234], который вызывает KeyError, если ни одна сущность не найдена.

, которая заставляет меня думать, что я ошибаюсь.

также: relMatch.match(a,"CREATED"), который вызывает

повышение ValueError («Узлы должны быть предоставлены как последовательность или набор»)

, сообщая, чтоЯ определенно не читаю документы правильно.

Не обязательно использовать этот класс, что, вероятно, не то, что я думаю, как мне подсчитать, сколько ["CREATED"] указано на a

Ответы [ 2 ]

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

С RelationshipMatcher вы можете просто считать, используя len.Поэтому, если я правильно прочитал ваш код, вам понадобится что-то вроде:

count = len(RelationshipMatcher(graph).match((None, a), "CREATED"))

Или еще проще:

count = len(graph.match((None, a), "CREATED"))

(поскольку graph.match - это ярлык для RelationshipMatcher(graph))

Кортеж (None, a) указывает упорядоченную пару узлов (отношения только в одном направлении), где начальным узлом является любой узел, а конечным узлом является a.Использование len просто оценивает совпадение и возвращает счет.

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

Ниже работает, и его легче написать, чем в предыдущей реализации, но я не думаю, что это правильный способ сделать это.

result = graph.run(
    "MATCH(a) < -[r:CREATED]-(b) WHERE ID(a)=" + str(a.identity) + " RETURN count(r)"
).evaluate()
print(result)
...