Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j查询节点属性。_Neo4j_Cypher_Graph Databases - Fatal编程技术网

Neo4j查询节点属性。

Neo4j查询节点属性。,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我有个人(姓名、年龄)和项目(姓名)的数据库。 我可以用密码查询指定我是个人还是项目的数据库吗 例如,我考虑了这两个实例: 节点(name=Alice,age=20) 节点(名称=Bob,年龄=31岁) 节点(名称=项目1) 节点(名称=项目2) -我想知道,我有没有办法说project1,它告诉我这是一个项目 -或者我问爱丽丝,它说这是一个人 谢谢您应该使用节点标签(如Person和Project)来表示节点“类型” 例如,要创建人员和项目,请执行以下操作: CREATE (:Person {

我有个人(姓名、年龄)和项目(姓名)的数据库。 我可以用密码查询指定我是个人还是项目的数据库吗

例如,我考虑了这两个实例:

节点(name=Alice,age=20) 节点(名称=Bob,年龄=31岁)

节点(名称=项目1) 节点(名称=项目2)

-我想知道,我有没有办法说project1,它告诉我这是一个项目

-或者我问爱丽丝,它说这是一个人


谢谢

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

例如,要创建人员和项目,请执行以下操作:

CREATE (:Person {name: 'Alice', age: 20})
CREATE (:Project {name: 'project1'})
要查找名为“Fred”的项目,请执行以下操作:

MATCH (p:Project {name: 'Fred'})
RETURN p;
要获取节点
n
的标签集合,可以调用
labels(n)
函数。然后,您可以查看该集合,查看您要查找的标签是否在其中。例如,如果您的密码查询以某种方式获得一个节点
n
,则此代码段将返回
n
,如果且仅当它具有
Person
标签:

.
.
.
WHERE 'Person' IN LABELS(n)
RETURN n;
[更新]

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

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

如果您想在一个查询中同时匹配这两个查询,您可以使用多种方法,具体取决于您的具体用例。例如,如果需要匹配节点和关系的笛卡尔积:

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

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

例如,要创建人员和项目,请执行以下操作:

CREATE (:Person {name: 'Alice', age: 20})
CREATE (:Project {name: 'project1'})
要查找名为“Fred”的项目,请执行以下操作:

MATCH (p:Project {name: 'Fred'})
RETURN p;
要获取节点
n
的标签集合,可以调用
labels(n)
函数。然后,您可以查看该集合,查看您要查找的标签是否在其中。例如,如果您的密码查询以某种方式获得一个节点
n
,则此代码段将返回
n
,如果且仅当它具有
Person
标签:

.
.
.
WHERE 'Person' IN LABELS(n)
RETURN n;
[更新]

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

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

如果您想在一个查询中同时匹配这两个查询,您可以使用多种方法,具体取决于您的具体用例。例如,如果需要匹配节点和关系的笛卡尔积:

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

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

需要注意的是,一般来说,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
匹配(n:命名)
其中n.name='blah'
将标签(n)作为类型
将筛选器(类型中的类型“Named”)作为标签
退货标签

请记住,您尚未指定名称在节点类型中是否应是唯一的,因此:Person、a:Project或多个:Person可能具有相同的名称,但不确定这将如何影响您的端部。如果每个命名的对象都应该有一个唯一的名称,那么您应该在:named.name上创建一个唯一的约束(尽管同样,您需要确保您创建的每个应该是:named的节点在创建时都应用了:named标签)。

因此您的用例是按名称搜索对象,这些东西可以是多种类型,而不是单一类型

需要注意的是,一般来说,Neo4j并不是为这个目的而构建的。通常,在Neo4j查询中,您知道要搜索的对象的类型,并且您正在探索该对象(或多个对象)之间的关系,以找出关联或由此派生的数据

也就是说,有很多方法可以做到这一点,尽管有必要研究一下您的其他用例,看看Neo4j是否真的是您想要做的事情的最佳工具

无论何时按属性进行查询,都需要标签/属性上的唯一约束或标签/属性上的索引。请注意,您需要将标签和属性组合在一起;在没有指定标签的情况下,您不能盲目地请求具有属性的节点并获得良好的性能,因为它必须扫描数据库中的所有节点(Neo4j中有一些较旧的手动索引,但我不确定这些索引是否会继续得到支持;开发人员建议使用模式索引)

有一种解决方法,因为Neo4j允许在同一节点上使用多个标签。如果只希望按名称查询某些类型(例如,仅项目和人员),则可以创建:命名标签,并在所有:项目和:人员节点(和)上设置该标签