2016-09-22 294 views
0

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

例如考虑我为每个这两个实例:

节点(名=爱丽丝,年龄= 20) 节点(名=鲍勃,年龄= 31)

节点(名= PROJECT1) 节点(名称= project2)

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

- 或我查询爱丽丝,它说我这是一个人?

感谢

回答

2

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

例如,创建一个人与一个项目:

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

要查找的项目(S)命名为“弗雷德”:

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

为了得到节点的标签的集合n,你可以调用LABELS(n)函数。然后,您可以查看该集合以查看您正在查找的标签是否在该标签中。例如,如果你的Cypher查询某种方式获取节点n,那么这个片段将返回n当且仅当它有Person标签:

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

[增订]

如果你想找到的所有节点与“弗雷德”的name属性值:

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

如果你想找到“弗雷德”的名称属性值的所有关系:

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

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

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

@Eli您可能需要查看[Cypher参考卡](https://neo4j.com/docs/cypher-refcard/current/),重点在标签部分。 – InverseFalcon

+0

@InverseFalcon谢谢你的回答。我的问题更高一级。例如,我查询术语“X”,我想知道它是一个关系的节点或属性的属性。然后我知道'X'这个词是人或项目。密码有这个能力吗? – Eli

+0

@Eli:我(@cybersam)最近更新了我的答案,它表明您可以使用LABELS功能来查找任何节点的标签。 – cybersam

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标签)。

+0

谢谢,你的回答是正确的。我在想图形数据库是这种查询的一个选项。我正在探索回答高水平搜索的选项('X'是人,地点,项目等)。您建议我寻找什么来回答这些问题? – Eli

+0

例如,谷歌如何知道汤姆汉克斯是一个人,并将我返回给某人的详细信息? – Eli

+0

您可能需要查看ElasticSearch,但通常我认为您正在寻找使用倒排索引的db解决方案。至于谷歌,谷歌不仅仅使用单一的数据库解决方案,他们所做的大部分工作都是自行开发的(并引入或启发了几种当前的技术)。当涉及到不知情的文本匹配时,使用倒排索引的dbs可能是最好的开始。他们还可以根据各种标准提高搜索结果,这听起来与您所要求的相似。 – InverseFalcon

相关问题