Так что ваш случай использования искать вещи по имени, и эти вещи могут быть несколько типов вместо одного типа.
Просто отметить, в общем, это не то, для чего построен Neo4j. Обычно в запросах Neo4j вы знаете тип вещи, которую ищете, и исследуете отношения между этой вещью (или вещами), чтобы выяснить ассоциации или данные, полученные из этого.
Тем не менее, есть способы, чтобы сделать это, хотя это стоит идти через остальную часть случаев использования и увидеть, если Neo4j действительно лучший инструмент для того, что вы пытаетесь сделать
Всякий раз, когда вы находитесь запрашивая свойство, вы либо хотите получить уникальное ограничение на метку/свойство, либо индекс на ярлыке/свойстве. Обратите внимание, что для этого вам нужна комбинация ярлыка и свойства; вы не можете вслепую попросить узел с свойством без указания метки и получить хорошую производительность, так как придется выполнять сканирование всех узлов в вашей базе данных (в Neo4j есть некоторые старые ручные индексы, но я не уверен, что они будут по-прежнему поддерживаться, индексы схемы рекомендуются разработчиками).
Существует обходное решение, так как Neo4j позволяет использовать несколько меток на одном узле. Если вы хотите только запросить определенные типы по имени (например, только проекты и люди), вы можете создать: Именованный ярлык и установить этот ярлык для всех: Project и: Person (и любые другие метки, на которые он должен применяться) , Затем вы можете создать индекс на: 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 (хотя, опять же, вам нужно убедиться, что каждый созданный вами узел должен быть: Именованный имеет: Именованный ярлык, применяемый при создании).
@Eli Вы можете просмотреть [ссылочную карту] Cypher (https://neo4j.com/docs/cypher-refcard/current/) с акцентом на раздел «Этикетки». – InverseFalcon
@InverseFalcon Спасибо за ответ. Мой вопрос на один уровень выше. Например, я запрашиваю термин «X», и я хочу знать, что это свойство узла или свойства отношения. Тогда я знаю, что термин «Х» - это человек или проект. У cypher есть эта способность? – Eli
@Eli: Я (@cybersam) недавно обновил свой ответ, и он показывает, что вы можете использовать функцию 'LABELS', чтобы найти метки любого узла. – cybersam