Запросы по меткам узлов и отношений - PullRequest
6 голосов
/ 29 января 2020

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

С точки зрения производительности и лучших практик Neo4j, какой вариант будет лучше, если я хочу классифицировать эти данные, чтобы потом возможность поиска / выборки, используя любую комбинацию типов этих классификаций?

Различные классификации:

  1. Пол (FEMALE, MALE)
  2. PersonType (STAFF, CUSTOMER )
  3. AgeGroup (11-20, 21-30, 31-40 и др. c)

Траектория содержит набор точек (time, x, y, motion_type ) это в основном говорит, куда человек пошел. Точка говорит вам точное местоположение человека в комнате в данный момент времени, и если это было жилье, ходьба или бег (это тип движения).

Например, получить все траектории, которые были ЖЕНЩИНОЙ, ЗАКАЗЧИКОМ с возрастом от 21 до 30

Вариант 1:

// Here I get the set of trajectories that fall within a certain time range (:Trajectory(at) is indexed)
MATCH (trajectory:Trajectory)
WHERE datetime("2020-01-01T00:00:00.000000+13:00") <= trajectory.at < datetime("2020-01-11T00:00:00.000000+13:00")

// Once I have all the trajectories I start filtering by the different criteria
MATCH (trajectory)-[:GENDER]->(:Female)
MATCH (trajectory)-[:PERSON_TYPE]->(:Customer)

// AgeGroup could have quite a lot of groups depending on how accurate the data is. At this stage we have 8 groups.
// Knowing that we have 8 groups, should I filter by property or should I have 8 different labels, one per age group? Is there any other option?
MATCH (trajectory)-[:AGE]->(age:AgeGroup)
WHERE age.group = "21-30"

RETURN COUNT(trajectory)

Вариант 2:

Узел траектории будет иметь вид доступно множество суб-меток в качестве категорий. Например, если я хочу получить тот же результат, что и в варианте 1, я сделаю что-то вроде:

MATCH (trajectory:Trajectory:Female:Customer)
WHERE datetime("2020-01-01T00:00:00.000000+13:00") <= trajectory.at < datetime("2020-01-11T00:00:00.000000+13:00")
MATCH (trajectory)-[:AGE]->(age:AgeGroup)
WHERE age.group = "21-30"

RETURN COUNT(trajectory)

// Or assuming I have a label per each age group:
MATCH (trajectory:Trajectory:Female:Customer:Age21-30)
WHERE datetime("2020-01-01T00:00:00.000000+13:00") <= trajectory.at < datetime("2020-01-11T00:00:00.000000+13:00")

RETURN COUNT(trajectory)

Поэтому я хочу знать:

  1. Как справиться с возрастом группы, если они представляют собой отдельные свойства, как разные метки или если есть лучший вариант.
  2. Как обрабатывать различные категории траектории: как метки или как отношения, указывающие на метку с информацией.

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

1 Ответ

1 голос
/ 29 января 2020

Когда вы следуете понятиям https://neo4j.com/docs/getting-started/current/graphdb-concepts/, у вас есть два базовых типа узлов Лица и местоположения Узлы людей могут иметь несколько меток

  1. Мужской или Женский для пола
  2. Персонал или Клиент для типа Персона
  3. Указанный возраст c метки Age_20_30

Узлы местоположения имеют свойства для местоположения, но не одно для времени.

Траектория, которую я бы смоделировал как отношение между Человеком и Местоположением со свойством на время с типом движения. Таким образом, вы можете иметь отношения типа DWELLING, WALKING и RUNNING между узлами Person и Location

В ваших запросах

MATCH (n)-[r]
WHERE n:Female and n:Customer and n:Age_20_30
AND   datetime("2020-01-01T00:00:00.000000+13:00") <= r.at < datetime("2020-01-11T00:00:00.000000+13:00")
RETURN COUNT(r)

Количество работающих клиентов будет равно

MATCH (n)-[r:RUNNING]
WHERE n:Female and n:Customer and n:Age_20_30
AND   datetime("2020-01-01T00:00:00.000000+13:00") <= r.at < datetime("2020-01-11T00:00:00.000000+13:00")
RETURN COUNT(r)
...