Neo4j查询节点属性。

时间:2016-09-22 21:10:10

标签: neo4j cypher graph-databases

我有实体人员(姓名,年龄)和项目(姓名)的数据库。 我可以在cypher中查询指定我是人还是项目的数据库?

例如,考虑我每个都有这两个实例:

节点(名称=爱丽丝,年龄= 20) 节点(名称= Bob,年龄= 31)

节点(name = project1) 节点(name = project2)

- 我想知道,有什么方法我只说project1,它告诉我这是一个项目。

- 或者我查询Alice,它说我这是一个人?

谢谢

2 个答案:

答案 0 :(得分:2)

您应该使用节点标签(例如PersonProject)来表示节点“类型”。

例如,要创建人员和项目:

CREATE (:Person {name: 'Alice', age: 20})
CREATE (:Project {name: 'project1'})

要查找名为'Fred'的项目:

MATCH (p:Project {name: 'Fred'})
RETURN p;

要获取节点n的标签集合,可以调用LABELS(n)函数。然后,您可以查看该集合,以查看您要查找的标签是否在那里。例如,如果您的Cypher查询以某种方式获取节点n,那么当且仅当它具有n标签时,此代码段才会返回Person

.
.
.
WHERE 'Person' IN LABELS(n)
RETURN n;

[增订]

如果要查找name属性值为“Fred”的所有节点:

MATCH (n {name: 'Fred'})
...

如果要查找名称属性值为“Fred”的所有关系:

MATCH ()-[r {name: 'Fred'})-()
...

如果要在单个查询中匹配两者,则有很多方法可以执行此操作,具体取决于您的确切用例。例如,如果您想要匹配节点和关系的笛卡尔积:

OPTIONAL MATCH (n {name: 'Fred'})
OPTIONAL MATCH ()-[r {name: 'Fred'})-()
...

答案 1 :(得分:2)

因此,您的用例是按名称搜索内容,这些内容可以是多种类型而不是单一类型。

请注意,一般来说,这不是Neo4j的基础。通常在Neo4j查询中,您知道要搜索的事物的类型,并且您正在探索该事物(或事物)之间的关系,以找出从中获得的关联或数据。

也就是说,有很多方法可以做到这一点,虽然值得通过其余的用例来看看Neo4j是否真的是你想要做的最好的工具

每当您通过属性查询时,您需要对标签/属性或标签/属性上的索引进行唯一约束。请注意,您需要标签和属性的组合;您不能盲目地要求具有属性的节点而不指定标签并获得良好的性能,因为它必须扫描数据库中的所有节点(Neo4j中有一些较旧的手动索引,但我不确定是否这些将继续得到支持;架构索引由开发人员推荐。

有一种解决方法,因为Neo4j允许同一节点上有多个标签。如果您只希望按名称查询某些类型(例如,仅查看项目和人员),则可以创建:命名标签,并在所有项目上设置该标签:项目和:人员节点(以及应该应用的任何其他标签) 。然后,您可以在:Named.name上创建索引。这样你的查询就像:

MATCH (n:Named)
WHERE n.name = 'blah'
WITH LABELS(n) as types
WITH FILTER(type in types WHERE type <> 'Named') as labels
RETURN labels

请记住,您尚未指定名称在节点类型中是否应该是唯一的,因此可能是:人员或:项目或多个:人员具有相同的名称,不确定这会影响到什么应该发生在你的最后。如果每个命名的东西都应该有一个唯一的名称,你应该在:Named.name上创建一个唯一的约束(尽管如此,你要确保你创建的每个节点都应该是:Named在创建时应用了:Named标签)。