数据模型问题:查询返回不在选择路径中的记录实例

问题描述 投票:0回答:1

我正在创建一个图形数据模型并在 neo4j aura 中加载一个 csv 文件。 下面是我的 csv 文件中的几行以及用于创建数据模型的脚本。

我的问题是,当查询特定区域的数据模型时,它会返回其他区域的犯罪计数/受害人数。

您能否建议我如何对稍后用于聚合和比较的数值数据进行建模?

ANZSOC Group,YYYY,Territorial Authority,Area Unit,Victimisations
Aggravated Robbery,2024,Auckland,Glen Innes North,4
Aggravated Sexual Assault,2024,Auckland,Glamorgan,1
Blackmail and Extortion,2024,Auckland,Glen Innes North,4
Common Assault,2024,Auckland,Glen Innes North,2
Illegal Use of a Motor Vehicle,2024,Auckland,Glamorgan,5
Illegal Use of a Motor Vehicle,2024,Auckland,Glen Innes North,17
Serious Assault Not Resulting in Injury,2024,Auckland,Glen Innes North,3
Serious Assault Resulting in Injury,2024,Auckland,Glen Innes North,7
"Theft (Except Motor Vehicles), N.E.C.",2024,Auckland,Glamorgan,1
"Theft (Except Motor Vehicles), N.E.C.",2024,Auckland,Glen Innes North,7
Theft From a Person (Excluding By Force),2024,Auckland,Glen Innes North,1
Theft of Motor Vehicle Parts or Contents,2024,Auckland,Glamorgan,4
Theft of Motor Vehicle Parts or Contents,2024,Auckland,Glen Innes North,17
"Unlawful Entry With Intent/Burglary, Break and Enter",2024,Auckland,Glamorgan,7
"Unlawful Entry With Intent/Burglary, Break and Enter",2024,Auckland,Glen Innes North,34

下面是创建数据模型的脚本:

pre_ingest:
  - CREATE CONSTRAINT crimetype_anzsocgroup IF NOT EXISTS FOR (n:CrimeType) REQUIRE n.anzsocGroup IS UNIQUE;
  - CREATE CONSTRAINT territorialauthority_cityname IF NOT EXISTS FOR (n:TerritorialAuthority) REQUIRE n.cityName IS UNIQUE;
  - CREATE CONSTRAINT areaunit_areaname IF NOT EXISTS FOR (n:AreaUnit) REQUIRE n.areaName IS UNIQUE;
files:
- chunk_size: 100
  cql: |
    WITH $dict.rows AS rows
    UNWIND rows AS row
    MERGE (n:CrimeType {anzsocGroup: row.`ANZSOC Group`})
  url: $BASE/
- chunk_size: 100
  cql: |
    WITH $dict.rows AS rows
    UNWIND rows AS row
    MERGE (n:TerritorialAuthority {cityName: row.`Territorial Authority`})
  url: $BASE/
- chunk_size: 100
  cql: |
    WITH $dict.rows AS rows
    UNWIND rows AS row
    MERGE (n:AreaUnit {areaName: row.`Area Unit`})
  url: $BASE/
- chunk_size: 100
  cql: |-
    WITH $dict.rows AS rows
    UNWIND rows AS row
    MERGE (n:CrimeEvent {year:toIntegerOrNull(row.YYYY), victimisation:toIntegerOrNull(row.Victimisations)})
  url: $BASE/
- chunk_size: 100
  cql: |
    WITH $dict.rows AS rows
    UNWIND rows as row
    MATCH (source:TerritorialAuthority {cityName: row.`Territorial Authority`})
    MATCH (target:AreaUnit {areaName: row.`Area Unit`})
    MERGE (source)-[n:HAS_SUB_REGION]->(target)
  url: $BASE/
- chunk_size: 100
  cql: |
    WITH $dict.rows AS rows
    UNWIND rows as row
    MATCH (areaUnit:AreaUnit {areaName: row.`Area Unit`})
    MATCH (crimeType:CrimeType {anzsocGroup: row.`ANZSOC Group`})
    MATCH (crimeEvent:CrimeEvent {year:toIntegerOrNull(row.YYYY), victimisation:toIntegerOrNull(row.Victimisations)})
    MERGE (areaUnit)-[c:HAS_CRIME]->(crimeType)-[t:HAS_CRIME_COUNT]->(crimeEvent)
  url: $BASE/

**查询和查询结果 - 查询还返回了区域单位的受害计数(即,它返回了 Glen Innes North 的犯罪计数。

我需要查询仅返回查询区域的实例。 **

MATCH path = (n:AreaUnit {areaName:"Glamorgan"})-[c:HAS_CRIME]->(t:CrimeType)-[:HAS_CRIME_COUNT]->(e:CrimeEvent)
RETURN path
1
(:AreaUnit {areaName: "Glamorgan"})-[:HAS_CRIME]->(:CrimeType {anzsocGroup: "Aggravated Sexual Assault"})-[:HAS_CRIME_COUNT]->(:CrimeEvent {year: 2024, victimisation: 1})
2
(:AreaUnit {areaName: "Glamorgan"})-[:HAS_CRIME]->(:CrimeType {anzsocGroup: "Illegal Use of a Motor Vehicle"})-[:HAS_CRIME_COUNT]->(:CrimeEvent {year: 2024, victimisation: 5})
3
(:AreaUnit {areaName: "Glamorgan"})-[:HAS_CRIME]->(:CrimeType {anzsocGroup: "Illegal Use of a Motor Vehicle"})-[:HAS_CRIME_COUNT]->(:CrimeEvent {year: 2024, victimisation: 17})
4
(:AreaUnit {areaName: "Glamorgan"})-[:HAS_CRIME]->(:CrimeType {anzsocGroup: "Theft (Except Motor Vehicles), N.E.C."})-[:HAS_CRIME_COUNT]->(:CrimeEvent {year: 2024, victimisation: 1})
5
(:AreaUnit {areaName: "Glamorgan"})-[:HAS_CRIME]->(:CrimeType {anzsocGroup: "Theft (Except Motor Vehicles), N.E.C."})-[:HAS_CRIME_COUNT]->(:CrimeEvent {year: 2024, victimisation: 7})
6
(:AreaUnit {areaName: "Glamorgan"})-[:HAS_CRIME]->(:CrimeType {anzsocGroup: "Theft of Motor Vehicle Parts or Contents"})-[:HAS_CRIME_COUNT]->(:CrimeEvent {year: 2024, victimisation: 4})
7
(:AreaUnit {areaName: "Glamorgan"})-[:HAS_CRIME]->(:CrimeType {anzsocGroup: "Theft of Motor Vehicle Parts or Contents"})-[:HAS_CRIME_COUNT]->(:CrimeEvent {year: 2024, victimisation: 17})
8
(:AreaUnit {areaName: "Glamorgan"})-[:HAS_CRIME]->(:CrimeType {anzsocGroup: "Unlawful Entry With Intent/Burglary, Break and Enter"})-[:HAS_CRIME_COUNT]->(:CrimeEvent {year: 2024, victimisation: 7})
9
(:AreaUnit {areaName: "Glamorgan"})-[:HAS_CRIME]->(:CrimeType {anzsocGroup: "Unlawful Entry With Intent/Burglary, Break and Enter"})-[:HAS_CRIME_COUNT]->(:CrimeEvent {year: 2024, victimisation: 34})

我需要查询仅返回我查询的区域的实例。因此,对于上面的示例,我需要查询仅返回区域 =“Glamorgan”的犯罪类型和犯罪计数。

neo4j datamodel
1个回答
0
投票

您的数据模型

(:AreaUnit)-[:HAS_CRIME]->(:CrimeType)-[:HAS_CRIME_COUNT]->(:CrimeEvent)
不支持您的用例。这是因为每种犯罪类型都有一个唯一的
CrimeType
节点,因此每个
CrimeType
节点都具有针对
所有
区域单位的传出 HAS_CRIME_COUNT 关系。

解决此问题的一种方法是将数据模型简化为:

(:AreaUnit)-[:HAS_CRIME]->(:CrimeEvent {type: ..., year: ..., count: ...})

使用该数据模型,对您的用例的查询将很简单:

MATCH path = (n:AreaUnit {areaName:"Glamorgan"})-[c:HAS_CRIME]->(e:CrimeEvent)
RETURN path

或者只是:

MATCH (n:AreaUnit {areaName:"Glamorgan"})-[c:HAS_CRIME]->(e:CrimeEvent)
RETURN n, COLLECT(e) AS crimeEvents
© www.soinside.com 2019 - 2024. All rights reserved.