Traverses all nodes or nodes of specified label and fuzzy compares the property/properties of the node
    with the supplied string.

    :param manager: Neo4jDBSessionManager
    :param value: Value to search for
    :param prop: Which property to look for value in
    :param node_type:

    :type value: str
    :type prop: str
    :type node_type: str
    :return: dicts

def search_nodes_by_value(manager, value, prop=None, node_type='Node'):
    """
    Traverses all nodes or nodes of specified label and fuzzy compares the property/properties of the node
    with the supplied string.

    :param manager: Neo4jDBSessionManager
    :param value: Value to search for
    :param prop: Which property to look for value in
    :param node_type:

    :type value: str
    :type prop: str
    :type node_type: str
    :return: dicts
    """
    if prop:
        q = """
            MATCH (n:{label})
            WHERE n.{prop} =~ "(?i).*{value}.*" OR any(x IN n.{prop} WHERE x =~ "(?i).*{value}.*")
            RETURN distinct n
            """.format(label=node_type, prop=prop, value=value)
    else:
        q = """
            MATCH (n:{label})
            WITH n, keys(n) as props
            WHERE any(prop in props WHERE n[prop] =~ "(?i).*{value}.*") OR
              any(prop in props WHERE any(x IN n[prop] WHERE x =~ "(?i).*{value}.*"))
            RETURN distinct n
            """.format(label=node_type, value=value)

    with manager.session as s:
        for result in s.run(q):
            yield result['n']