Подсчитайте количество типов отношений, чтобы добавить их как свойство частоты к краям - PullRequest
1 голос
/ 17 июня 2019

Я пытаюсь сосчитать различные типы отношений в моем графике neo4j, чтобы добавить их как свойство «частоты» к соответствующим ребрам (т.е. у меня есть 4 типа отношений e: EX, поэтому я хотел бы, чтобы мои ребра типа EX иметь e.frequency = 4).

Пока я играл с этим кодом:

MATCH ()-[e:EX]-()
WITH e, count(e) as amount  
SET e.frequency = amount
RETURN e

Для этого фрагмента кода моя возвращенная e.frequency равна 2 для всех ребер EX. Может, кто-нибудь здесь знает, как это исправить?

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Во-первых, вот что делает ваш запрос

// Match all EX edges (relationships), ignore direction
MATCH ()-[e:EX]-()
// Logical partition; With the edges, count how many times that instance occurred (will always be 2. (a)-[e:EX]->(b) and the reverse order of (b)<-[e:EX]-(a)
WITH e, count(e) as amount
// Set the property frequency on the instance of e to amount (2)
SET e.frequency = amount
// return the edges
RETURN e

Таким образом, чтобы отфильтровать дубликаты (совпадение в обратном направлении), вам нужно указать направление в МАТЧЕ. Так что MATCH ()-[e:EX]->(). для частотной части вам даже не нужно совпадение; Вы можете просто сосчитать вхождения шаблона WITH SIZE(()-[:EX]->()) as c (РАЗМЕР, потому что сопоставление с образцом возвращает список, а не набор строк)

So

WITH SIZE(()-[:EX]->()) as c
MATCH ()-[e:EX]->()
SET e.frequency = c
return e

Несмотря на то, что частота будет недействительной, как только край EX будет создан или удален, поэтому я просто открою ваш Cypher с запросом количества ребер.

Кроме того, в этом тривиальном случае лучший способ получить счетчик отношений - использовать MATCH-COUNT, поскольку эта форма помогает планировщику Cypher распознать, что он может просто получить счетчик ребер из своего внутреннего хранилища метаданных.

MATCH ()-[e:EX]->()
WITH COUNT(e) as c
MATCH ()-[e:EX]->()
SET e.frequency = c
return e
1 голос
/ 17 июня 2019

Похоже, что вы хотите эту информацию для быстрого доступа позже для любого узла с этим типом.Если вы планируете удалять или добавлять ребра в вашем графике, вы должны понимать, что ваши данные быстро устареют, и для всего графа запрос на обновление свойства каждого ребра в графике просто не имеет смысла.

К счастью, Neo4j хранит хранилище транзакций с различной статистикой, включая количество отношений для каждого типа отношений.

Проще всего получить их через вызовы процедур, либо в самом Neo4j, либо в процедурах APOC.

Если у вас установлен APOC, вы можете увидеть карту подсчета типов отношений следующим образом:

CALL apoc.meta.stats() YIELD relTypesCount
RETURN relTypesCount

Если вы знаете, какой тип вы хотите подсчитать, вы можете использовать точечную запись на карте relTypesCountчтобы получить значение, о котором идет речь.

Если оно динамическое (либо переданное в качестве параметра, либо полученное после сопоставления с отношением в запросе), вы можете использовать нотацию индекса карты, чтобы получить такой счет, как этот:

CALL apoc.meta.stats() YIELD relTypesCount
MATCH ()-[r]->()
WITH relTypesCount, r
LIMIT 5
RETURN type(r) as type, relTypesCount[type(r)] as count

Если у вас нет APOC, вы можете использовать db.stats.retrieve('GRAPH COUNTS') YIELD data, но вам придетсяo некоторая дополнительная фильтрация, чтобы убедиться, что вы получаете значения для ВСЕХ связей данного типа и исключаете значения, которые включают метки начального или конечного узлов:

CALL db.stats.retrieve('GRAPH COUNTS') YIELD data
WITH [entry IN data.relationships WHERE NOT exists(entry.startLabel) AND NOT exists(entry.endLabel)] as relCounts
MATCH ()-[r]->()
WITH relCounts, r
LIMIT 5
RETURN type(r) as type, [rel in relCounts WHERE rel.relationshipType = type(r) | rel.count][0] as count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...